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

Posgres9.5でWITHcluaseを使用してupsertを使用するときに、挿入された行のIDを取得するにはどうすればよいですか?

    WITH first SELECTで行う理由は私にはわかりませんでしたが、UPDATE idしか返さない理由はわかりませんでした。 INSERTreturnを選択していないためです。

    コメントで言及されている(そしてリンクされている)ように、Postgres9.5はINSERTONCONFLICT句をサポートしています。これははるかにクリーンな使用方法です。

    そして、9.5の前後のいくつかの例:

    9.5より前:WITHを使用する一般的な方法

    WITH    u AS (
                UPDATE      products
                SET         product_key='test123', count_parts=33
                WHERE       product_key = 'test123'
                RETURNING   id
            ),i AS (
                INSERT
                INTO        products ( product_key, count_parts )
                SELECT      'test123', 33
                WHERE       NOT EXISTS( SELECT 1 FROM u )
                RETURNING   id
            )
    SELECT  *
    FROM    (       SELECT id FROM u
            UNION   SELECT id FROM i
            ) r;
    

    9.5以降:INSERT ..ONCONFLICTの使用

    INSERT INTO products ( product_key, count_parts )
    VALUES      ( 'test123', 33 )
    ON CONFLICT ( product_key ) DO
    UPDATE
    SET         product_key='test123', count_parts=33
    RETURNING   id;
    

    更新:

    コメントで示唆されているように、INSERT .. ON CONFLICTを使用するとわずかな短所があるかもしれません 仕方。
    自動インクリメントを使用するテーブルで、このクエリが頻繁に発生する場合は、WITH より良いオプションかもしれません。
    もっと見る: https://stackoverflow.com/a/39000072/1161463 >




    1. PHP:mysql_connect()はコマンドラインからは機能しません

    2. ClassicASPのADODBからパラメータ化されたOracleクエリを呼び出す

    3. ServiceController.Stop()の後にサービスが完全に停止していません

    4. ルビーの移行はロールバックされましたが、移行を再度実行するとエラーが発生します