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

行が更新または挿入されたかどうかを検出します

    システム列xmaxを見ることができます 違いを伝えるために。 0です この場合、挿入された行の場合。

    CREATE TABLE tbl(id int PRIMARY KEY, col int);
    INSERT INTO tbl VALUES (1, 1);
    
    INSERT INTO tbl(id, col)
    VALUES (1,11), (2,22)
    ON     CONFLICT (id) DO UPDATE
    SET    col = EXCLUDED.col
    RETURNING *, (xmax = 0) AS inserted;

    これは、文書化されていない実装の詳細に基づいており、将来のリリースで変更される可能性があります(可能性は低いですが)。 Postgres9.5および9.6で動作します。

    その美しさ:追加の列を導入する必要はありません。

    詳細な説明:

    • PostgreSQL Upsertは、システム列XMIN、XMAXなどを使用して挿入された行と更新された行を区別します



    1. 1つの列でDISTINCTを選択

    2. SQL ServerでRAND()を決定論的にする方法

    3. Django +Postgres+大規模な時系列

    4. 数値テーブルを作成してデータを入力するための最良の方法は何ですか?