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

SET KENDALA SEMUA TUNDA TIDAK berfungsi seperti yang diharapkan

Hanya DEFERRABLE kendala dapat ditangguhkan.

Izinkan saya menyarankan alternatif yang lebih baik terlebih dahulu:

1. INSERT berurutan

Membalikkan urutan INSERT pernyataan dan tidak ada yang perlu ditunda. Paling sederhana dan tercepat - jika memungkinkan.

2. Perintah tunggal

Lakukan dalam satu perintah . Maka masih tidak ada yang perlu ditunda, karena batasan yang tidak dapat ditangguhkan diperiksa setelah setiap perintah dan CTE dianggap sebagai bagian dari satu perintah:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(2)
   )
INSERT INTO a(i) VALUES(2);

Saat melakukannya, Anda dapat menggunakan kembali nilai untuk INSERT pertama; lebih aman / lebih nyaman untuk kasus tertentu atau sisipan multi-baris:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(3)
   RETURNING j
   )
INSERT INTO a(i)
SELECT j FROM ins1;

Tapi saya butuh batasan yang ditangguhkan! (Benarkah?)

ALTER TABLE b ADD CONSTRAINT fkey_ij FOREIGN KEY (j)
   REFERENCES a (i) MATCH SIMPLE
   ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE;  -- !!!

Kemudian kode asli Anda bekerja (sedikit lebih lambat, karena kendala yang ditangguhkan menambah biaya).

db<>fiddle di sini

Terkait:

Jawaban asli saya mengutip manual :

Tapi itu menyesatkan karena hanya berlaku untuk "tindakan referensial", yaitu apa yang terjadi ON UPDATE atau ON DELETE ke baris dalam tabel yang direferensikan. Kasing yang ada bukan salah satunya - sebagai @zer0hedge ditunjukkan .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Replikasi Streaming PostgreSQL vs Replikasi Logis

  2. Segarkan tampilan yang terwujud dengan konkurensi

  3. PostgreSQL:FATAL - Otentikasi rekan gagal untuk pengguna (PG::ConnectionBad)

  4. Perbandingan kesetaraan/ketidaksetaraan SQL dengan nilai nullable

  5. Bagaimana cara MEMILIH data dari tabel anak di PostgreSQL?