Bu sorunun yılları geçmesine rağmen, İspanyolca konuşanlar için açıklığa kavuşturmak istiyorum, testler Postgres'de yapıldı:
Aşağıdaki kısıtlama, kitin birincil anahtar olduğu 1337 kayıtlık bir tabloya eklendi:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Bu tablo için varsayılan bir birincil anahtar OLUŞTURMAZ, bu nedenle bir sonraki GÜNCELLEME çalışırken hata alırız:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
HATA: yinelenen anahtar benzersizlik kısıtlamasını ihlal ediyor «unique_div_nkit»
Postgres'te, her SATIR için bir GÜNCELLEME yürütülmesi, KISITLAMA veya KISITLAMANIN karşılandığını doğrular.
CONSTRAINT IMMEDIATE artık yaratılmıştır ve her ifade ayrı ayrı yürütülür:
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;
Sorgu TAMAM, 0 satır etkilenir (yürütme süresi: 0 ms; toplam süre: 0 ms) Sorgu Tamam, 1328 satır etkilenir (yürütme süresi: 858 ms; toplam süre: 858 ms) HATA: llave duplicada viola restción de unicidad «unique_div_nkit» DETAIL : Ya existe la llave (div_nkit) = (1338).
Burada SI, ilk tam cümleyi (1328 satır) yürüttüğü için birincil anahtarın değiştirilmesine izin verir; ancak işlemde olmasına rağmen (BEGIN), CONSTRAINT her cümleyi COMMIT yapmadan bitirdikten hemen sonra doğrulanır, bu nedenle INSERT yürütülürken hata üretir. Son olarak CONSTRAINT DEFERRED'i aşağıdakileri yaptık:
**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
** Cümle 2 ** ifadelerinin her bir cümlesini, her cümleyi ayrı ayrı yürütürsek, doğrulamadığı için INSERT'de herhangi bir hata üretilmez, ancak son COMMIT tutarsızlık bulunduğu yerde yürütülür.
İngilizce tam bilgi için bağlantıları kontrol etmenizi öneririz:
Derinlikte Ertelenebilir SQL Kısıtlamaları
ERTELENMEYEN BAŞLANGIÇLA İLGİLİ DEFERRABLE DEĞİL