sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL:シリアルvsアイデンティティ

    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構文を使用することをお勧めします




    1. 結果として完全な日時値を使用してSQLServerの1時間あたりの行数をカウントします

    2. カスタム型配列をPostgres関数に渡す方法

    3. SQLサーバースキーマとデフォルトスキーマ

    4. MySQL –リストからインデックス位置を抽出するELT()およびFILED()関数