serial
は、長年Postgresの一部であった自動生成された一意の値の「古い」実装です。ただし、これはSQL標準の一部ではありません。
SQL標準への準拠を強化するために、Postgres10ではgenerated as identity
を使用した構文が導入されました。 。
基盤となる実装は引き続きシーケンスに基づいており、定義はSQL標準に準拠しています。この新しい構文で可能になることの1つは、値が誤って上書きされるのを防ぐことです。
次の表を検討してください。
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
実行すると:
insert into t1 (id) values (1);
基になるシーケンスとテーブルの値は同期されなくなりました。別の
を実行する場合insert into t1 default_values;
シーケンスが最初の挿入で進められなかったためにエラーが発生し、値1
を挿入しようとします また。
ただし、2番目のテーブルでは
insert into t2 (id) values (1);
結果:
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
したがって、誤ってシーケンスの使用法を「忘れる」可能性があります。 override system value
を使用して、これを強制することもできます オプション:
insert into t2 (id) overriding system value values (1);
それでも、テーブルの値と同期していないシーケンスが残りますが、少なくともそのことに気づきました。
シリアルではなく、新しいID構文を使用することをお勧めします