私はPostgreSQLにMySQLデータベースを移植しています。今まで私はすべてのテーブルとカラムを再構築してデータをインポートしました。ただし、自動インクリメントされた固有のid
フィールドは正しく変換されていません。私はpgAdmin GUIを使ってテーブルの1つのカラムを修正しました。私はおそらくMySQLからPostgresへの最初の変換ではないと思うので、これを自動化されたタスクとして実行するための堅牢でテストされた方法があります。誰かがこのような小さなスクリプトを提供できるのであれば、私はそれを感謝します。私は配列を付加し、問題の列のデフォルト値を設定した後に問題に遭遇したのでPostGres 9.5:mysqlから移行した後の自動インクリメント
主な理由は、しかし、私はこのためのテストソリューションを希望する理由です。シーケンスの現在の値は、最後のテーブルエントリの値である2069
に正しく設定されていました。プログラムを走らせて行を追加すると、一意の値2069
が既に割り当てられているという例外がありました。プログラムを再実行したときに新しい行が作成されましたが、自動増分IDは2071
でした。それは2070
をスキップしました。 JavaのJDBCコネクタ
- バグ: は、だから今、エラーの3つの可能なソースがあります。
テスト済みのソリューションを使用することで、私は最後の可能性を排除することができました。
Postgresシーケンスジェネレータが穴を避けるための義務はありません。未使用の番号を逐次的に生成することを意図しており、エラーのために元に戻す必要のあるトランザクションがある場合は、未使用のまま破棄される可能性があります。 – tadman
@tadman私はこれをよく知っています。問題はそれが残す「穴」ではなく、予期しない動作です。プログラムは最初にデータを挿入しませんでしたが、代わりに例外がスローされました。なぜこれが起こったのか調査したいと思います。私は修正すべきテーブルがさらにあり、この不規則な振る舞いが将来起こりえないことを確認したい。 – nautical
毎回2ずつインクリメントされますか?おそらくあなたのコードは挿入の前に何とか 'nextval()'を呼びますか?しかし、あなたが正しく物事を処理しない限り、泥棒は言ったスキップされたIDは何かを傷つけるつもりはありません。 –