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

存在しない場合のシーケンスの作成方法

    Postgres9.5以降

    IF NOT EXISTS CREATE SEQUENCEに追加されました Postgres9.5で。これが今の簡単な解決策です:

    CREATE SEQUENCE IF NOT EXISTS myschema.myseq;
    

    しかし、とにかく時代遅れの答えの詳細を考慮してください...
    そしてあなたはserialについて知っています またはIDENTITY 列ですよね?

    • テーブル列の自動インクリメント

    Postgres9.4以前

    シーケンスは、名前空間を他のいくつかのテーブルのようなオブジェクトと共有します。マニュアル:

    シーケンス名は、他のシーケンス、テーブル、インデックス、ビュー、または外部テーブルの名前とは異なる必要があります 同じスキーマ内。

    大胆な強調鉱山。したがって、3つのケースがあります:

    1. 名前が存在しません。 ->シーケンスを作成します。
    2. 同じ名前のシーケンスが存在します。 ->何もしませんか?出力はありますか?ロギングはありますか?
    3. 同じ名前の他の競合するオブジェクトが存在します。 ->何かしますか?出力はありますか?ロギングはありますか?

    どちらの場合も何をするかを指定します。 DO ステートメントは次のようになります:

    DO
    $do$
    DECLARE
       _kind "char";
    BEGIN
       SELECT relkind
       FROM   pg_class
       WHERE  oid = 'myschema.myseq'::regclass  -- sequence name, optionally schema-qualified
       INTO  _kind;
    
       IF NOT FOUND THEN       -- name is free
          CREATE SEQUENCE myschema.myseq;
       ELSIF _kind = 'S' THEN  -- sequence exists
          -- do nothing?
       ELSE                    -- object name exists for different kind
          -- do something!
       END IF;
    END
    $do$;
    

    オブジェクトタイプ(relkindpg_classで マニュアルによると:

    r=通常のテーブル
    i=インデックス
    S=シーケンス
    v=ビュー
    m=マテリアライズドビュー
    c=複合型
    t=TOASTテーブル
    f=外部テーブル

    関連:

    • 特定のスキーマにテーブルが存在するかどうかを確認する方法


    1. oracleのMODIFYCOLUMN-null許容に設定する前に、列がnull許容かどうかを確認するにはどうすればよいですか?

    2. 複数のデータベースに準拠したオンラインSQL構文チェッカー

    3. SQL Server(T-SQL)の日付から年の日を取得する

    4. ssisフラットファイルソースの不正な行をスキップする方法