PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menggunakan nilai pengembalian dari DELETE untuk UPDATE di Postgres

PostgreSQL tidak mengizinkan campuran pernyataan UPDATE dan DELETE sebagai subquery.

Anda dapat menggunakan strategi yang sedikit berbeda - CTE yang dapat diperbarui

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

jadi

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)

Perhatian:Memerlukan 9.1 atau lebih baru




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melacak Ketersediaan Tinggi untuk PostgreSQL Dengan Detak Jantung

  2. PHP Postgres:Dapatkan ID Sisipan Terakhir

  3. Bagaimana Anda terhubung ke Database Postgres tanpa kata sandi menggunakan pg-promise?

  4. Mungkinkah menggunakan pandas/sqlalchemy untuk memasukkan array ke dalam database sql? (postgres)

  5. Menggabungkan pernyataan INSERT dalam CTE yang memodifikasi data dengan ekspresi CASE