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

PostgresでSQLServerのID列に相当するものを作成する方法

    tl; dr

    Postgres 10で、 GENERATED BY DEFAULT AS IDENTITYを指定します。 SQL標準に従って。

    create table tower 
    (
      npages integer, 
      ifnds integer, 
      ifnid integer, 
      name varchar(20), 
      towid integer GENERATED BY DEFAULT AS IDENTITY    -- per SQL standard
    )
    

    ID列

    Postgres 10は、identity列 の概念をサポートするようになりました。 、および標準のSQL構文を使用します。私はMSSQLServerの専門家ではありませんが、この新しい標準サポートは同等だと思います。

    生成された…IDとして

    GENERATED…ASIDENTITY CREATE TABLE中に使用されるコマンド 暗黙のシーケンスを作成します。 SERIAL とは異なり、そのシーケンスの作成、命名、権限、および削除は透過的です。 。今では非常に直感的です。テーブルに使用権限を付与すると、シーケンスの使用権限が付与されます。テーブルを削除すると、シーケンスは自動的に削除されます。

    標準構文の2つのフレーバー。違いは、値を生成させるのではなく、値を渡す場合にのみ重要です。通常、人々は常に生成された値に依存するため、通常は最初のバージョンである GENERATED BY DEFAULT AS IDENTITYを使用します。 。

    • デフォルトでIDとして生成
      • INSERT でない限り、値を生成します コマンドは値を提供します。
    • 常にIDとして生成
      • INSERTによって提供される値を無視します OVERRIDING SYSTEM VALUEを指定しない限り

    CREATE TABLEを参照してください ドキュメントのページ。

    この興味深いページ をお読みください PeterEisentrautによる。彼はSERIALに関するいくつかの奇妙な問題について説明しています 。新しいID列機能にはそのような問題はありません。したがって、 SERIALを使用する理由はありません。 もう、マイナス面はなく、プラス面のみです。 シリアル GENERATED…ASIDENTITYに取って代わられます

    ID列は必ずしも主キーである必要はなく、自動的にインデックスが作成されるわけではないことに注意してください。したがって、 PRIMARY KEYを指定する必要があります。 それがあなたの意図であるかどうかを明示的に(通常の場合のように)。

    CREATE TABLE person_ (
    
        id_ 
            INTEGER 
            GENERATED BY DEFAULT AS IDENTITY   -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
            PRIMARY KEY                        -- Creates index. Specifies UNIQUE. Marks column for relationships.
            ,
    
        name_ 
            VARCHAR( 80 )
    
    ) ;
    

    意図は、内部実装の詳細があなたから隠されることです。秘密裏に生成されているシーケンスの名前を知っている必要はありません。たとえば、基になるシーケンスを知らなくても、列を介してカウンターをリセットできます。

    ALTER TABLE person_ 
        ALTER COLUMN id_ 
        RESTART WITH 1000      -- Reset sequence implicitly, without a name.
    ;
    

    IDを暗黙的に指定する:

    • 列にマークを付けるNOTNULL
    • シーケンスを作成します
      • シーケンスのタイプが列と一致します(32ビット64ビットなど)
    • シーケンスを列に結び付けます
      • 権限を継承します
      • カスケードドロップ
      • 列の名前が変更されても、列に関連付けられたままになります
    • その列のデフォルト値のソースとしてシーケンスを指定します

    ID列は、 CREATESEQUENCE<と同じオプションを使用できます。 / code>

    • START WITH start
    • MINVALUE minvalue | NO MINVALUE
    • MAXVALUE maxvalue | NO MAXVALUE
    • INCREMENT[BY]インクリメント
    • CYCLE | NO CYCLE
    • CACHE キャッシュ
    • 所有者なし
      (所有権は自動的に管理されるため、ID列に所有権を指定しても意味がありません)

    オプションの愚かな例:

    id_ INTEGER 
    GENERATED BY DEFAULT AS IDENTITY ( 
        START WITH 200 
        MINVALUE 100 
        MAXVALUE 205 
        CYCLE 
        INCREMENT BY 3 
    ) PRIMARY KEY
    

    4行の追加:



    1. org.hibernate.ObjectDeletedException:削除されたオブジェクトはカスケードによって再保存されます(削除されたオブジェクトを関連付けから削除します)

    2. MySqlでの動的な列名の選択

    3. oracle12cでSQLクエリの結果をJSONとして返します

    4. bash変数使用時のSqlplusログインエラー:SP2-0306:無効なオプション