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

PostgresのUPDATEにDELETEからの戻り値を使用する

    PostgreSQLでは、サブクエリとしてUPDATEステートメントとDELETEステートメントを混在させることはできません。

    少し異なる戦略を使用できます-更新可能なCTE

    postgres=# WITH t1 AS (DELETE FROM foo RETURNING *), 
                    t2 AS (INSERT INTO deleted 
                              SELECT * FROM t1 RETURNING *) 
                 SELECT max(a) FROM t2;
    

    だから

    postgres=# CREATE TABLE comment(id int, score int);
    CREATE TABLE
    postgres=# CREATE TABLE history(id int, comment_id int, vote int);
    CREATE TABLE
    postgres=# INSERT INTO comment values(1,10);
    INSERT 0 1
    postgres=# INSERT INTO comment values(2,20);
    INSERT 0 1
    postgres=# INSERT INTO history values(1,1,5);
    INSERT 0 1
    postgres=# WITH t1 AS (DELETE FROM history 
                           WHERE id=1 
                           RETURNING comment_id, vote) 
               UPDATE comment SET score=score-t1.vote 
               FROM t1 
               WHERE t1.comment_id=comment.id;
    UPDATE 1
    postgres=# select * from comment;
     id | score 
    ----+-------
      2 |    20
      1 |     5
    (2 rows)
    

    重要:9.1以降が必要です




    1. パラメータ(connectstring、user、passwort ...)を使用してコマンドラインからSQLDeveloperを開きます。

    2. SQLServer2008でビューを再構築する方法

    3. このタイプのデータベース設定を使用する理由を理解しようとしています

    4. Erlang Mysql:SQLインジェクションを防ぐ方法