Meskipun tahun-tahun pertanyaan ini telah berlalu, saya ingin mengklarifikasi untuk penutur bahasa Spanyol, tes telah dilakukan di Postgres:
Kendala berikut telah ditambahkan ke tabel catatan 1337, di mana kit adalah kunci utama:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Ini menciptakan kunci utama default TIDAK DITAWARKAN untuk tabel sehingga ketika mencoba PEMBARUAN berikutnya kita mendapatkan kesalahan:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
GALAT: kunci duplikat melanggar batasan keunikan «unique_div_nkit»
Di Postgres, menjalankan UPDATE untuk setiap ROW memverifikasi bahwa PEMBATASAN atau KONSTRAINT terpenuhi.
SEGERA CONSTRAINT sekarang dibuat dan setiap pernyataan dieksekusi secara terpisah:
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
Kueri OK, 0 baris terpengaruh (waktu eksekusi: 0 ms; total waktu: 0 ms) Kueri OK, 1328 baris terpengaruh (waktu eksekusi: 858 ms; total waktu: 858 ms) KESALAHAN: llave duplikat biola restricci de de unicidad «unique_div_nkit» DETAIL : Ya existe la llave (div_nkit) = (1338).
Di sini SI memungkinkan mengubah kunci utama karena mengeksekusi seluruh kalimat lengkap pertama (1328 baris); tetapi meskipun sedang dalam transaksi (BEGIN), CONSTRAINT segera divalidasi setelah menyelesaikan setiap kalimat tanpa membuat KOMIT, oleh karena itu menghasilkan kesalahan ketika menjalankan INSERT. Akhirnya kami membuat CONSTRAINT DEFERRED melakukan hal berikut:
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
Jika kami menjalankan setiap pernyataan ** Blok 2 **, setiap kalimat secara terpisah, tidak ada kesalahan yang dihasilkan ke INSERT karena itu tidak valid tetapi KOMIT akhir dieksekusi di mana ia menemukan ketidakkonsistenan.
Untuk informasi lengkap dalam bahasa Inggris, saya sarankan Anda memeriksa tautannya:
Kendala SQL yang Ditangguhkan dalam Kedalaman
BUKAN DITANGGUNG JAWAB SEGERA DITERBITKAN