Хотя годы этого вопроса прошли, я хотел бы уточнить для испаноязычных, тесты были проведены в Postgres:
Следующее ограничение было добавлено в таблицу из 1337 записей, где комплект является первичным ключом:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Это создает первичный ключ по умолчанию NOT DEFERRED для таблицы, поэтому при попытке следующего UPDATE мы получаем ошибку:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
ОШИБКА: дубликат ключа нарушает ограничение уникальности «unique_div_nkit»
В Postgres выполнение UPDATE для каждого ROW проверяет, удовлетворено ли ОГРАНИЧЕНИЕ или ОГРАНИЧЕНИЕ.
CONSTRAINT IMMEDIATE теперь создан, и каждый оператор выполняется отдельно:
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;
Запрос в порядке, затронуто 0 строк (время выполнения: 0 мс; общее время: 0 мс) Запрос в порядке, затронуто 1328 строк (время выполнения: 858 мс; общее время: 858 мс) : Ya existe la llave (div_nkit) = (1338).
Здесь SI позволяет изменить первичный ключ, поскольку он выполняет все первое полное предложение (1328 строк); но хотя он находится в транзакции (BEGIN), CONSTRAINT проверяется сразу после завершения каждого предложения без выполнения COMMIT, поэтому выдает ошибку при выполнении INSERT. Наконец, мы создали CONSTRAINT DEFERRED и сделаем следующее:
**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
Если мы выполним каждый оператор ** Block 2 **, каждое предложение отдельно, в INSERT не будет сгенерировано никакой ошибки, поскольку он не проверяется, но выполняется последний COMMIT, где он обнаруживает несоответствие.
Для полной информации на английском я предлагаю вам проверить ссылки:
Отложенные ограничения SQL в глубине
НЕ ОТДЫХАЕТСЯ, а НЕ ОТДЫХАЕТСЯ ПЕРВОНАЧАЛЬНО НЕМЕДЛЕННО