Liquibaseの命令autoIncrement="true"
serial
を生成します PostgreSQLの列。 serial
の場合 列PostgreSQLは、tablename_colname_seq
のような名前のシーケンスを作成します 。このシーケンスからデフォルトの列値が割り当てられます。
ただし、明示的に シリアル列に値を挿入します。シーケンスジェネレーターには影響せず、次の値は変更されません。したがって、重複する値を生成する可能性があります。これはまさにあなたのケースです。
明示的な値を挿入した後にこれを防ぐには、ALTER SEQUENCE
を使用してシーケンスジェネレーターの現在の値を変更する必要があります。 ステートメントまたはsetval()
を使用 機能、例:
ALTER SEQUENCE tablename_colname_seq RESTART WITH 42;
SELECT setval('tablename_colname_seq', (SELECT max(colname) FROM tablename));
これで問題が解決するはずです。