PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Używanie wartości zwracanej przez DELETE dla UPDATE w Postgres

PostgreSQL nie zezwala na mieszanie instrukcji UPDATE i DELETE jako podzapytania.

Możesz użyć trochę innej strategii - aktualizowalne CTE

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

więc

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)

Uwaga:wymaga wersji 9.1 lub nowszej




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. aktualizowanie wierszy tabeli w postgresie za pomocą podzapytania

  2. Kolejność Railsów według pola asocjacji

  3. Co się dzieje z NOTIFY, gdy żadna sesja nie wysłała LISTEN w PostgreSQL?

  4. Jak działa Log() w PostgreSQL

  5. Jak sprawdzić stan serwera PostgreSQL Mac OS X?