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

シーケンスのPostgreSQLの次の値?

    RETURNING

    これは、1回の往復で可能です。 データベースへ:

    INSERT INTO tbl(filename)
    VALUES ('my_filename')
    RETURNING tbl_id;
    

    tbl_id 通常はserialになります またはIDENTITY (Postgres 10以降)列。詳細はマニュアルをご覧ください。

    明示的に値をフェッチ

    filenameの場合 tbl_idを含める必要があります (冗長に)、引き続き単一のクエリを使用できます。

    lastval()を使用します または、より具体的な currval()

    INSERT INTO tbl (filename)
    VALUES ('my_filename' || currval('tbl_tbl_id_seq')   -- or lastval()
    RETURNING tbl_id;
    

    参照:

    • 同じINSERT中の別の列のシリアル列の参照値

    プロセスで複数のシーケンスが進行する可能性がある場合(トリガーやその他の副作用によっても)、確実 方法はcurrval('tbl_tbl_id_seq')を使用することです 。

    シーケンスの名前

    文字列リテラル 'tbl_tbl_id_seq' 私の例では、実際の シーケンスの名前であり、regclassにキャストされます 、現在のsearch_pathにその名前のシーケンスが見つからない場合、例外が発生します 。

    tbl_tbl_id_seq テーブルの自動生成されたデフォルトですtbl シリアル列tbl_id 。ただし、保証はありません。列のデフォルトでは、任意のから値をフェッチできます そのように定義されている場合はシーケンス。また、テーブルの作成時にデフォルトの名前が使用されている場合、Postgresは単純なアルゴリズムに従って次のフリーネームを選択します。

    わからない serialのシーケンスの名前 列には、専用関数 pg_get_serial_sequence()を使用します 。その場で実行できます:

    INSERT INTO tbl (filename)
    VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
    RETURNING tbl_id;
    

    db<>ここでフィドル
    古いsqlfiddle



    1. SQLServerのID列の増分値を返します

    2. OracleのRAWTOHEX()関数

    3. PostgreSQLの特定のスキーマのデータベースに保存されているすべての関数のリストを取得するにはどうすればよいですか?

    4. SQL Server 2005で大文字と小文字を区別するように変更するにはどうすればよいですか?