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 пÑовеÑÑÐµÑ Ð½ÐµÐ¾ÑкладÑваемÑе огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи немедленно, а не в конÑе опеÑаÑоÑа, как пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑÑандаÑÑ.