Хоча роки цього питання минули, я хотів би уточнити для іспанських, хто виступає, тести були зроблені в Postgres:
Наступне обмеження було додано до таблиці 1337 записів, де набір є основним ключем:
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
Це створює первинний ключ за замовчуванням НЕ ВИЗНАЧЕНО для таблиці, тому при спробі наступного ОНОВЛЕННЯ ми отримуємо помилку:
update ele_kitscompletos
set div_nkit = div_nkit + 1;
ПОМИЛКА: дублюючий ключ порушує обмеження унікальності «unique_div_nkit»
У Postgres, виконуючи ОНОВЛЕННЯ для кожного ROW, перевіряється, чи дотримано RESTRICTION або CONSTRAINT.
Тепер створено 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), КОНСТРАНТ перевіряється відразу після закінчення кожного речення, не складаючи COMMIT, тому створює помилку під час виконання ВСТУП. Нарешті ми створили ВІДКРИТИЙ ВИМОГ, зробивши наступне:
**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
Якщо ми виконуємо кожне висловлення ** Блок 2 **, кожне речення окремо, INSERT не створює жодних помилок, оскільки він не підтверджує, але остаточний COMMIT виконується там, де виявляється невідповідність.
Для отримання повної інформації англійською мовою пропоную перейти за посиланнями:
Відкладені обмеження SQL в глибині
НЕ ЗАМОВЛЕННЯ проти ВІДПОВІДНОГО ІНТИЦІАЛЬНО НЕМАТИЧНОГО