2016-10-24 6 views
0

私はPostgreSQLにMySQLデータベースを移植しています。今まで私はすべてのテーブルとカラムを再構築してデータをインポートしました。ただし、自動インクリメントされた固有のidフィールドは正しく変換されていません。私はpgAdmin GUIを使ってテーブルの1つのカラムを修正しました。私はおそらくMySQLからPostgresへの最初の変換ではないと思うので、これを自動化されたタスクとして実行するための堅牢でテストされた方法があります。誰かがこのような小さなスクリプトを提供できるのであれば、私はそれを感謝します。私は配列を付加し、問題の列のデフォルト値を設定した後に問題に遭遇したのでPostGres 9.5:mysqlから移行した後の自動インクリメント

主な理由は、しかし、私はこのためのテストソリューションを希望する理由です。シーケンスの現在の値は、最後のテーブルエントリの値である2069に正しく設定されていました。プログラムを走らせて行を追加すると、一意の値2069が既に割り当てられているという例外がありました。プログラムを再実行したときに新しい行が作成されましたが、自動増分IDは2071でした。それは2070をスキップしました。 JavaのJDBCコネクタ

  • で9.5
  • バグは、私は自動インクリメントフィールドと配列とミスをしたPostgreSQLで

    • バグ:

      は、だから今、エラーの3つの可能なソースがあります。

    テスト済みのソリューションを使用することで、私は最後の可能性を排除することができました。

  • +1

    Postgresシーケンスジェネレータが穴を避けるための義務はありません。未使用の番号を逐次的に生成することを意図しており、エラーのために元に戻す必要のあるトランザクションがある場合は、未使用のまま破棄される可能性があります。 – tadman

    +0

    @tadman私はこれをよく知っています。問題はそれが残す「穴」ではなく、予期しない動作です。プログラムは最初にデータを挿入しませんでしたが、代わりに例外がスローされました。なぜこれが起こったのか調査したいと思います。私は修正すべきテーブルがさらにあり、この不規則な振る舞いが将来起こりえないことを確認したい。 – nautical

    +0

    毎回2ずつインクリメントされますか?おそらくあなたのコードは挿入の前に何とか 'nextval()'を呼びますか?しかし、あなたが正しく物事を処理しない限り、泥棒は言ったスキップされたIDは何かを傷つけるつもりはありません。 –

    答えて

    0

    とにかく古い質問ですが、私はここで同じ "問題"を持っています。

    私は、アプリケーションdbMigration.NET(http://fishcodelib.com/DBMigration.htm)の助けを借りて、MySQLからPostgreSQLにデータベースを移行しました。

    結果を確認した後、私は時々シーケンスが正しい「最後の値を」持っていないことがわかります。たとえば、id 2976ではなく、1から始まります。この場合、次の値は2になります。

    私の古いデータベースでは、いくつかの行が削除されたので、私(あなたが海の場合と同じように)場合は、PostgreSQLは次の値を保存しようとしているアプリケーションを再度保存します。このidが "free"の場合、セーブは正常終了します。たぶんこれはあなたのために同じケースです。これはバグや他の何かではありません。

    結果として、シーケンスは、テーブルの現在の最新の最終値に設定する必要があります。各シーケンスのクエリを次のようにこれを行う:

    SELECT SETVAL('testtable_id_seq', (select max(id) from testtable)); 
    

    または、sqeuencenameが知られていない場合:

    SELECT SETVAL(pg_get_serial_sequence('testtable', 'id'), (SELECT max(id) FROM testtable)); 
    

    は、私はあなたの質問を誤解しないでお願い致します。しかし、これは、同じ "問題"を持つ他の人に役立つかもしれません。

    関連する問題