PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използване на върната стойност от DELETE за UPDATE в Postgres

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да използвам променлива като име на таблица в node-pg?

  2. Как мога да вмъкна общи данни във временна таблица от различни схеми?

  3. npgsql тип данни неизвестен при използване на група по

  4. Релси - вземете обекти на обекти С дубликати

  5. PostgreSQL:SELECT WHERE по-малко от 15 минути