Перейти к основному содержимому

SET CONSTRAINTS

примечание

Эта страница переведена при помощи нейросети GigaChat.

SET CONSTRAINTS - установка времени проверки ограничений для текущей транзакции.

Синтаксис

SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

Описание

SET CONSTRAINTS управляет режимом проверки ограничений в пределах текущей транзакции. Ограничения в режиме IMMEDIATE проверяются в конце каждого оператора. Ограничения в режиме DEFERRED проверяются только при фиксации транзакции (COMMIT). Каждое ограничение может иметь свой собственный режим — IMMEDIATE или DEFERRED.

При создании ограничению присваивается одна из трех характеристик: DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE или NOT DEFERRABLE. Ограничения типа NOT DEFERRABLE всегда работают в режиме IMMEDIATE и не затрагиваются командой SET CONSTRAINTS. Первые два типа начинают транзакцию в заданном режиме (DEFERRED или IMMEDIATE), но их поведение можно изменить внутри транзакции с помощью SET CONSTRAINTS.

Команда SET CONSTRAINTS с перечислением имен ограничений изменяет режим только для указанных ограничений (все они должны быть откладываемыми — DEFERRABLE). Имена ограничений могут быть указаны с именем схемы. Если схема не указана — используется текущий путь поиска схем. Команда SET CONSTRAINTS ALL изменяет режим всех откладываемых ограничений.

Если SET CONSTRAINTS переводит ограничение из режима DEFERRED в IMMEDIATE, то проверка уже накопленных изменений происходит немедленно во время выполнения этой команды.

Если такое изменение приводит к нарушению ограничения, команда завершится с ошибкой, и режим останется прежним. Таким образом, SET CONSTRAINTS можно использовать, чтобы принудительно проверить ограничения в определенный момент внутри транзакции.

В настоящее время этим механизмом управляются следующие типы ограничений:

  • UNIQUE;
  • PRIMARY KEY;
  • REFERENCES (внешний ключ);
  • EXCLUDE.

Ограничения NOT NULL и CHECK всегда проверяются немедленно при вставке или обновлении строки — не в конце оператора и не при коммите транзакции.

Также любые UNIQUE и EXCLUDE ограничения, созданные без DEFERRABLE, проверяются немедленно и не могут быть отложены.

Срабатывание триггеров, объявленных как «триггеры ограничений», также зависит от текущего режима — они выполняются в тот момент, когда должна быть проверена связанная с ними проверка ограничения.

Примечания

В PostgreSQL имена ограничений не обязаны быть уникальными внутри схемы (они должны быть уникальны только в пределах таблицы). Поэтому может быть найдено несколько совпадений для указанного имени. В этом случае SET CONSTRAINTS применится ко всем найденным совпадениям. При этом, если имя не содержит схемы, поиск прекращается при первом совпадении — схемы, идущие позже в пути поиска, не проверяются.

Эта команда изменяет поведение ограничений только в рамках текущей транзакции. Если выполнить ее вне блока транзакции, PostgreSQL выдает предупреждение, и команда не оказывает эффекта.

Совместимость

Команда SET CONSTRAINTS соответствует стандарту SQL, за исключением следующих отличий:

  • В PostgreSQL команда не применяется к ограничениям NOT NULL и CHECK (в стандарте допускается).
  • Также PostgreSQL проверяет неоткладываемые ограничения UNIQUE немедленно, тогда как по стандарту они должны проверяться в конце оператора.