SET CONSTRAINTS
SET CONSTRAINTS — установить время проверки ограничений для текущей транзакции
Синтаксис
SET CONSTRAINTS { ALL | имя
[, ...] } { DEFERRED | IMMEDIATE }
Описание
SET CONSTRAINTS
определяет, когда будут проверяться ограничения в текущей транзакции. Ограничения IMMEDIATE
проверяются в конце каждого оператора, а ограничения DEFERRED
откладываются до фиксации транзакции. Режим IMMEDIATE
или DEFERRED
задаётся для каждого ограничения независимо.
При создании ограничение получает одну из следующих характеристик: DEFERRABLE INITIALLY DEFERRED
(откладываемое, изначально отложенное), DEFERRABLE INITIALLY IMMEDIATE
(откладываемое, изначально немедленное) или NOT DEFERRABLE
(неоткладываемое). Третий вариант всегда подразумевает IMMEDIATE
и на него команда SET CONSTRAINTS
не влияет. Первые два варианта запускаются в каждой транзакции в указанном режиме, но их поведение можно изменить в рамках транзакции командой SET CONSTRAINTS
.
SET CONSTRAINTS
со списком имён ограничений меняет режим только этих ограничений (все они должны быть откладываемыми). Имя любого ограничения можно дополнить схемой. Если имя схемы не указано, в поисках первого подходящего имени будет просматриваться текущий путь поиска схем. SET CONSTRAINTS ALL
меняет режим всех откладываемых ограничений.
Когда SET CONSTRAINTS
меняет режим ограничения с DEFERRED
на IMMEDIATE
, новый режим начинает действовать в обратную сторону: все изменения данных, ожидающие проверки в конце транзакции, вместо этого проверяются в момент выполнения команды SET CONSTRAINTS
. Если какое-либо ограничение нарушается, при выполнении SET CONSTRAINTS
происходит ошибка (и режим проверки не меняется). Таким образом, с помощью SET CONSTRAINTS
можно принудительно проверить ограничения в определённом месте транзакции.
В настоящее время это распространяется только на ограничения UNIQUE
, PRIMARY KEY
, REFERENCES
(внешний ключ) и EXCLUDE
. Ограничения NOT NULL
и CHECK
всегда проверяются немедленно в момент добавления или изменения строки (не в конце оператора). Ограничения уникальности и ограничения-исключения, объявленные без указания DEFERRABLE
, так же проверяются немедленно.
Срабатывание триггеров, объявленных как «триггеры ограничений» так же зависит от этой команды — они срабатывают в момент, когда должно проверяться соответствующее ограничение.
Примечания
Так как PostgreSQL не требует, чтобы имена ограничений были уникальны в схеме (достаточно уникальности в таблице), возможно, что для заданного имени найдётся несколько соответствующих ограничений. В этом случае SET CONSTRAINTS
подействует на все эти ограничения. Для имён без указания схемы, её действие будет распространяться только на ограничение(я), найденное в первой из схем; другие схемы просматриваться не будут.
Эта команда меняет поведение ограничений только в текущей транзакции. При выполнении этой команды вне блока транзакции выдаётся предупреждение и больше ничего не происходит.
Совместимость
Эта команда реализует поведение, описанное в стандарте SQL, с одним исключением — в PostgreSQL она не влияет на проверку ограничений NOT NULL
и CHECK
. Кроме того, PostgreSQL проверяет неоткладываемые ограничения уникальности немедленно, а не в конце оператора, как предлагает стандарт.