1. ホーム
  2. postgresql

[解決済み] PostgreSQL: シリアルとアイデンティティ

2023-05-08 07:45:38

質問

テーブルの主キーに整数の自動採番を行うには、以下のようにします。 SERIAL

しかし、私はこのテーブルの information_schema.columns にはいくつもの identity_ フィールドがあり、実際に を持つカラムを作成します。 GENERATED 指定子 ...

この違いは何ですか? 異なるPostgreSQLのバージョンで導入されたのですか?どちらかが優先されるのでしょうか?

どのように解決するのですか?

serial は、古くからPostgresの一部であった、自動生成される一意な値の古い実装です。しかし、これは標準SQLの一部ではありません。

標準SQLに準拠するために、Postgres 10では、以下の構文が導入されました。 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);

のように、テーブルの値と同期していない配列が残りますが、少なくともあなたはそのことを認識しました。


推奨 を使用することをお勧めします。