Помимо других (правильных) ответов, , говоря о PostgreSQL , следует указать, что:
с NOT DEFERRABLE каждая строка проверяется во время вставки / обновления
с DEFERRABLE (в настоящее время IMMEDIATE ) все строки проверяются вконец вставки / обновления
с DEFERRABLE (в настоящее время DEFERRED ), все строки проверяются в конце транзакции
Так что неверно говорить, что ограничение DEFERRABLE действует как ограничение NOT DEFERRABLE, когда оно установлено в IMMEDIATE.
Давайте уточнимэта разница:
CREATE TABLE example(
row integer NOT NULL,
col integer NOT NULL,
UNIQUE (row, col) DEFERRABLE INITIALLY IMMEDIATE
);
INSERT INTO example (row, col) VALUES (1,1),(2,2),(3,3);
UPDATE example SET row = row + 1, col = col + 1;
SELECT * FROM example;
Это правильно выводит:

Но если мы удалим инструкцию DEFERRABLE INITIALLY IMMEDIATE,
ОШИБКА: двойное значение ключа нарушает уникальное ограничение "example_row_col_key" ПОДРОБНОЕ: Ключ ("строка", столбец) = (2, 2) уже существует.********** Ошибка **********
ОШИБКА: двойное значение ключа нарушает уникальное ограничение «example_row_col_key» Состояние SQL: 23505 Detail: Key («row»,col) = (2, 2) уже существует.
ADDENDUM (12 октября 2017 г.)
Такое поведениедействительно задокументировано здесь , раздел «Совместимость»:
Кроме того, PostgreSQL проверяет неотложные ограничения уникальности немедленно, а не в конце оператора, как предполагает стандарт.