sql >> Databasteknik >  >> RDS >> PostgreSQL

Använder returvärde från DELETE för UPPDATERING i Postgres

PostgreSQL tillåter inte blandning av UPDATE- och DELETE-satser som underfråga.

Du kan använda en lite annan strategi - uppdateringsbar 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)

Observera:Det kräver 9.1 eller senare




  1. Hibernate kodar fel medan kvarstående objekt [UTF-8]

  2. Finns det något sätt att cachelagra en vy så att frågor mot den går snabbt?

  3. Problem med att kontrollera om en tabell finns eller inte i db

  4. Hur man kör olika sql för att få data enligt tidigare indata i pentaho kettle