https://stackoverflow.com/questions/55300370/postgresql-serial-vs-identity
serialは、Postgresで古くから使われてきた自動生成された一意の値の「古い」実装です。しかし、これはSQL標準の記法ではありません。
よりSQL標準に準拠するために、Postgres 10では、generated as identityを使用する構文が導入されました。
基本的な実装はまだシーケンスに基づいていますが、定義はSQL標準に準拠するようになりました。この新しい構文で可能になったことの一つは、値が誤って上書きされるのを防ぐことです。
以下の表を考えてみましょう。
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.そのため、シーケンスの使用法を誤って「忘れてしまう」ことがあります。これを強制的に行うには、システム値の上書きオプションを使用します。
insert into t2 (id) overriding system value values (1);これでもテーブルの値と同期していないシーケンスが残りますが、少なくともあなたはそれを認識していたことになります。