Chociaż lata tego pytania minęły, chciałbym wyjaśnić dla hiszpańskojęzycznych, testy zostały wykonane w Postgres:
Do tabeli 1337 rekordów dodano następujące ograniczenie, w którym zestaw jest kluczem podstawowym:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Tworzy to domyślny klucz podstawowy NIE ODNIESIONY dla tabeli, więc przy próbie następnej aktualizacji otrzymujemy błąd:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
BŁĄD: duplikat klucza narusza ograniczenie unikatowości «unique_div_nkit»
W Postgres wykonanie AKTUALIZACJI dla każdego WIERSZA sprawdza, czy OGRANICZENIE lub OGRANICZENIE jest spełnione.
Utworzono NATYCHMIASTOWY OGRANICZNIK, a każda instrukcja jest wykonywana osobno:
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;
Zapytanie OK, wpłynęło 0 wierszy (czas wykonania: 0 ms; całkowity czas: 0 ms) Zapytanie OK, wpłynęło 1328 wierszy (czas wykonania: 858 ms; całkowity czas: 858 ms) BŁĄD: llave duplicada viola resticción de unicidad «unikalny_div_nkit» SZCZEGÓŁ : Ya existe la llave (div_nkit) = (1338).
Tutaj SI pozwala zmienić klucz podstawowy, ponieważ wykonuje całe pierwsze pełne zdanie (1328 wierszy); ale chociaż jest w transakcji (POCZĄTEK), OGRANICZENIE jest sprawdzane natychmiast po zakończeniu każdego zdania bez wykonania polecenia COMMIT, dlatego generuje błąd podczas wykonywania WSTAWIANIA. Wreszcie stworzyliśmy CONSTRRAINT DEFERRED, wykonując następujące czynności:
**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
Jeśli wykonamy każdą instrukcję ** Bloku 2 **, każde zdanie osobno, INSERT nie zostanie wygenerowany błąd, ponieważ nie sprawdza poprawności, ale wykonuje się ostateczne polecenie COMMIT w przypadku stwierdzenia niespójności.
Aby uzyskać pełne informacje w języku angielskim, sugeruję sprawdzenie linków:
Głębokie ograniczenia SQL
NIE ZNALEZIONE w porównaniu do ZNACZNIE NATYCHMIASTOWEJ NATYCHMIASTU