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