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

PostgreSQLアップサートクエリの問題

    UPDATE 最初のCTEでupdated 行なしを生成します 。つまり、NULLは取得されません。 updated.idの値 また。 updatedに参加する場合 、何も得られない 、したがってINSERTはありません どちらかが起こります。

    NOT EXISTSで動作するはずです :

    WITH updated AS (
       UPDATE vote_user_table v
       SET    positive = TRUE       -- use booleann values ..
             ,negative = FALSE      -- .. instead of quoted string literals
       FROM   usuario u
       WHERE  v.review_id = 6       -- guessing origin
       AND    v.user_id = u.id
       AND    u.username ILIKE '[email protected]'
       RETURNING v.id
       )
    INSERT INTO vote_user_table (review_id, user_id, positive, negative)
    SELECT 6, u.id, TRUE, FALSE
    FROM   usuario u
    WHERE NOT EXISTS (SELECT 1 FROM updated)
    AND    u.username ILIKE '[email protected]';

    競合状態の可能性はまだごくわずかであることに注意してください。 同時負荷が大きい場合。この関連する質問の詳細:
    トランザクションでアップサート>




    1. 隣接するレコード間の差異を取得するSQLクエリ

    2. tinyint(size)、varchar(size):サイズの説明

    3. データベースを削除して再作成した後、Hibernateにテーブルの作成を強制する

    4. PHPとMySQLで安全なログインスクリプトを作成する方法