CREATE DOMAIN
CREATE DOMAIN â ÑоздаÑÑ Ð´Ð¾Ð¼ÐµÐ½
СинÑакÑиÑ
CREATE DOMAINимÑ[ AS ]Ñип_даннÑÑ[ COLLATEпÑавило_ÑоÑÑиÑовки] [ DEFAULTвÑÑажение] [огÑаниÑение_домена[ ... ] ] ÐдеÑÑогÑаниÑение_домена: [ CONSTRAINTимÑ_огÑаниÑениÑ] { NOT NULL | NULL | CHECK (вÑÑажение) }
ÐпиÑание
CREATE DOMAIN ÑоздаÑÑ Ð½Ð¾Ð²Ñй домен. Ðомен по ÑÑÑи пÑедÑÑавлÑÐµÑ Ñобой Ñип даннÑÑ
Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми ÑÑловиÑми (огÑаниÑиваÑÑими допÑÑÑимÑй Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений). ÐладелÑÑем домена ÑÑановиÑÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÐµÐ³Ð¾ ÑоздавÑий.
ÐÑли задаÑÑÑÑ Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ (напÑимеÑ, CREATE DOMAIN myschema.mydomain ...), домен ÑоздаÑÑÑÑ Ð² Ñказанной ÑÑ
еме, в пÑоÑивном ÑлÑÑае â в ÑекÑÑей. ÐÐ¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° должно бÑÑÑ ÑникалÑнÑм ÑÑеди имÑн Ñипов и доменов, ÑÑÑеÑÑвÑÑÑиÑ
в ÑÑой ÑÑ
еме.
ÐÐ¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ Ð°Ð±ÑÑÑагиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вÑнеÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑÐ¸Ñ Ñ Ð°ÑакÑеÑиÑÑик ÑазнÑÑ Ð¿Ð¾Ð»ÐµÐ¹ в единое меÑÑо Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ ÑопÑовождениÑ. ÐапÑимеÑ, в неÑколÑÐºÐ¸Ñ ÑаблиÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ ÑÑолбеÑ, ÑодеÑжаÑий ÑлекÑÑоннÑй адÑеÑ, и Ð´Ð»Ñ Ð²ÑÐµÑ ÑÑебÑÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе огÑаниÑÐµÐ½Ð¸Ñ CHECK, пÑовеÑÑÑÑие ÑинÑакÑÐ¸Ñ Ð°Ð´ÑеÑа. Ð ÑÑом ÑлÑÑае лÑÑÑе опÑеделиÑÑ Ð´Ð¾Ð¼ÐµÐ½, а не задаваÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑаблиÑÑ Ð¾ÑделÑнÑе огÑаниÑениÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð´Ð¾Ð¼ÐµÐ½, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñего Ñипа.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемого домена (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
Ñип_даннÑÑÐижележаÑий Ñип даннÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð° (Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¾Ð¿Ñеделение маÑÑива Ñ ÑÑим Ñипом).
пÑавило_ÑоÑÑиÑовкиÐеобÑзаÑелÑное Ñказание пÑавила ÑоÑÑиÑовки Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°. ÐÑли ÑÑо Ñказание оÑÑÑÑÑÑвÑеÑ, в домене иÑполÑзÑеÑÑÑ Ð¿Ñавило ÑоÑÑиÑовки нижележаÑего Ñипа даннÑÑ . УказаÑÑ
COLLATEможно, ÑолÑко еÑли нижележаÑий Ñип даннÑÑ ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑм.DEFAULTвÑÑажениеÐÑедложение
DEFAULTопÑеделÑÐµÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑов, Ñипом даннÑÑ ÐºÐ¾ÑоÑÑÑ ÑвлÑеÑÑÑ ÑÑÐ¾Ñ Ð´Ð¾Ð¼ÐµÐ½. ÐнаÑением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое вÑÑажение без пеÑеменнÑÑ (подзапÑоÑÑ Ñакже не допÑÑкаÑÑÑÑ). Тип даннÑÑ ÑÑого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑооÑвеÑÑÑвоваÑÑ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð°. ÐÑли знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ Ñказано, им бÑÐ´ÐµÑ Ð·Ð½Ð°Ñение NULL.ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² лÑбой опеÑаÑии Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑок, в коÑоÑой не задано знаÑение Ð´Ð»Ñ ÑÑого ÑÑолбÑа. ÐÑли знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑÑолбÑа, оно бÑÐ´ÐµÑ Ð¿ÐµÑеопÑеделÑÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ, ÑвÑзанное Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼. Ð ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° пеÑеопÑеделÑÐµÑ Ð»Ñбое знаÑение по ÑмолÑаниÑ, ÑвÑзанное Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñим Ñипом даннÑÑ .
CONSTRAINTимÑ_огÑаниÑениÑÐÐ¼Ñ Ð¾Ð³ÑаниÑениÑ. ÐÑли не Ñказано Ñвно, Ð¸Ð¼Ñ Ð±ÑÐ´ÐµÑ ÑгенеÑиÑовано ÑиÑÑемой.
NOT NULLÐнаÑÐµÐ½Ð¸Ñ ÑÑого домена бÑдÑÑ Ð¾ÑлиÑÐ½Ñ Ð¾Ñ NULL (но Ñм. замеÑÐ°Ð½Ð¸Ñ Ð½Ð¸Ð¶Ðµ).
NULLÐÑÐ¾Ñ Ð´Ð¾Ð¼ÐµÐ½ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð·Ð½Ð°Ñение NULL. ÐÑо ÑвойÑÑво домена по ÑмолÑаниÑ.
ÐÑо пÑедложение пÑедназнаÑено ÑолÑко Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ Ð½ÐµÑÑандаÑÑнÑми базами даннÑÑ SQL. ÐÑполÑзоваÑÑ ÐµÐ³Ð¾ в новÑÑ Ð¿ÑиложениÑÑ Ð½Ðµ ÑекомендÑеÑÑÑ.
CHECK (вÑÑажение)ÐÑедложениÑ
CHECKзадаÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи или пÑовеÑки, коÑоÑÑм Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдовлеÑвоÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°. Ðаждое огÑаниÑение должно пÑедÑÑавлÑÑÑ Ñобой вÑÑажение, вÑдаÑÑее ÑезÑлÑÑÐ°Ñ Ñипа Boolean. ÐÑовеÑÑемое знаÑение в ÑÑом вÑÑажении обознаÑаеÑÑÑ ÐºÐ»ÑÑевÑм ÑловомVALUE. ÐÑли вÑÑажение вÑдаÑÑ FALSE, ÑообÑаеÑÑÑ Ð¾Ð± оÑибке и пÑиведение знаÑÐµÐ½Ð¸Ñ Ðº ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° запÑеÑаеÑÑÑ.РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð²ÑÑажениÑ
CHECKне могÑÑ ÑодеÑжаÑÑ Ð¿ÐµÑеменнÑе, кÑомеVALUE, и подзапÑоÑÑ.Ðогда Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° задано неÑколÑко огÑаниÑений
CHECK, они бÑдÑÑ Ð¿ÑовеÑÑÑÑÑÑ Ð² алÑавиÑном поÑÑдке имÑн. (Ðо веÑÑии 9.5 в PostgreSQL не бÑло ÑÑÑановлено никакого опÑеделÑнного поÑÑдка обÑабоÑки огÑаниÑенийCHECK.)
ÐÑимеÑаниÑ
ÐгÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°, в ÑаÑÑноÑÑи NOT NULL, пÑовеÑÑÑÑÑÑ Ð¿Ñи пÑеобÑазовании знаÑÐµÐ½Ð¸Ñ Ðº ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°. Ðднако из ÑÑолбÑа, коÑоÑÑй номиналÑно Ð¸Ð¼ÐµÐµÑ Ñип домена, вÑÑ Ð¶Ðµ можно пÑоÑиÑаÑÑ NULL, неÑмоÑÑÑ Ð½Ð° Ñакое огÑаниÑение. ÐапÑимеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоиÑÑ
одиÑÑ Ð² запÑоÑе внеÑнего ÑоединениÑ, еÑли ÑÑÐ¾Ð»Ð±ÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð° окажеÑÑÑ Ð² обнÑлÑемой ÑÑоÑоне внеÑнего ÑоединениÑ. Ðолее Ñонкий пÑимеÑ:
INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));
ÐÑÑÑой ÑкалÑÑнÑй вложеннÑй SELECT вÑдаÑÑ Ð·Ð½Ð°Ñение NULL, Ñипом коÑоÑого бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð¼ÐµÐ½, Ñак ÑÑо к ÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе пÑовеÑки огÑаниÑений и ÑÑÑока бÑÐ´ÐµÑ ÑÑпеÑно добавлена.
ÐзбежаÑÑ ÑакиÑ
пÑоблем оÑÐµÐ½Ñ Ñложно, Ñак как в SQL вообÑе пÑедполагаеÑÑÑ, ÑÑо знаÑение NULL ÑвлÑеÑÑÑ Ð¿Ð¾Ð´Ñ
одÑÑим Ð´Ð»Ñ Ð»Ñбого Ñипа даннÑÑ
. Таким обÑазом, лÑÑÑе вÑего ÑазÑабаÑÑваÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL допÑÑкалиÑÑ, а заÑем пÑи необÑ
одимоÑÑи пÑименÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ NOT NULL к ÑÑолбÑам доменного Ñипа, а не непоÑÑедÑÑвенно к ÑÐ°Ð¼Ð¾Ð¼Ñ ÑÑÐ¾Ð¼Ñ ÑипÑ.
Ð PostgreSQL пÑедполагаеÑÑÑ, ÑÑо ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¾Ð³ÑаниÑений CHECK ÑвлÑÑÑÑÑ Ð¿Ð¾ÑÑоÑннÑми, Ñо еÑÑÑ Ð¿Ñи одинаковÑÑ
вÑ
однÑÑ
знаÑениÑÑ
они вÑегда вÑдаÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй ÑезÑлÑÑаÑ. Ðменно ÑÑим пÑедположением опÑавдÑваеÑÑÑ Ñо, ÑÑо огÑаниÑÐµÐ½Ð¸Ñ CHECK пÑовеÑÑÑÑÑÑ ÑолÑко пÑи пеÑвом пÑеобÑазовании знаÑÐµÐ½Ð¸Ñ Ð² Ñип домена, а не пÑи каждом обÑаÑении к немÑ. (Ðо ÑÑÑи Ñаким же обÑазом обÑабаÑÑваÑÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK Ð´Ð»Ñ ÑаблиÑ, как опиÑано в ÐодÑазделе 5.5.1.)
Ðднако ÑÑо пÑедположение Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑÑÑаÑÑÑÑ, как ÑаÑÑо бÑваеÑ, когда в вÑÑажении CHECK иÑполÑзÑеÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ°Ñ ÑÑнкÑиÑ, поведение коÑоÑой впоÑледÑÑвии менÑеÑÑÑ. PostgreSQL не запÑеÑÐ°ÐµÑ ÑÑого, и еÑли ÑоÑ
ÑанÑннÑе знаÑÐµÐ½Ð¸Ñ Ñипа домена пеÑеÑÑанÑÑ ÑдовлеÑвоÑÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK, ÑÑо оÑÑанеÑÑÑ Ð½ÐµÐ·Ð°Ð¼ÐµÑеннÑм. РиÑоге пÑи попÑÑке загÑÑзиÑÑ Ð²ÑгÑÑженнÑе позже даннÑе могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¿ÑоблемÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑекомендÑеÑÑÑ Ð¾ÑÑÑеÑÑвлÑÑÑ ÑледÑÑÑим обÑазом: ÑдалиÑÑ Ð¾Ð³ÑаниÑение (иÑполÑзÑÑ ALTER DOMAIN), измениÑÑ Ð¾Ð¿Ñеделение ÑÑнкÑии, а заÑем пеÑеÑоздаÑÑ Ð¾Ð³ÑаниÑение Ñой же командой, коÑоÑÐ°Ñ Ð¿Ñи ÑÑом пеÑепÑовеÑÐ¸Ñ ÑоÑ
ÑанÑннÑе даннÑе.
РекомендÑеÑÑÑ ÑледиÑÑ Ð·Ð° Ñем, ÑÑÐ¾Ð±Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ CHECK не вÑдавали оÑибки.
ÐÑимеÑÑ
Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ñип даннÑÑ
us_postal_code (поÑÑовÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¡Ð¨Ð), коÑоÑÑй заÑем иÑполÑзÑеÑÑÑ Ð² опÑеделении ÑаблиÑÑ. ÐÐ»Ñ Ð¿ÑовеÑки знаÑÐµÐ½Ð¸Ñ Ð½Ð° ÑооÑвеÑÑÑвие ÑоÑмаÑÑ Ð¿Ð¾ÑÑовÑÑ
индекÑов СШРпÑименÑеÑÑÑ Ð¿ÑовеÑка Ñ ÑегÑлÑÑнÑми вÑÑажениÑми:
CREATE DOMAIN us_postal_code AS TEXT
CHECK(
VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);
CREATE TABLE us_snail_addy (
address_id SERIAL PRIMARY KEY,
street1 TEXT NOT NULL,
street2 TEXT,
street3 TEXT,
city TEXT NOT NULL,
postal us_postal_code NOT NULL
);СовмеÑÑимоÑÑÑ
Ðоманда CREATE DOMAIN ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL.
СинÑакÑÐ¸Ñ NOT NULL данной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL (ÑооÑвеÑÑÑвÑÑÑий ÑÑандаÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³ Ð´Ð»Ñ Ð½ÐµÑоÑÑавнÑÑ
Ñипов даннÑÑ
â ÑÑо CHECK (VALUE IS NOT NULL); однако в ÑооÑвеÑÑÑвии Ñ Ð Ð°Ð·Ð´ÐµÐ»Ð¾Ð¼ «ÐÑимеÑаниÑ» подобнÑÑ
огÑаниÑений лÑÑÑе избегаÑÑ). «ÐгÑаниÑение» NULL ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL (Ñм. Ñакже СовмеÑÑимоÑÑÑ).