5.3. ÐенеÑиÑÑемÑе ÑÑолбÑÑ #
ÐенеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ ÑвлÑеÑÑÑ ÑÑолбÑом оÑобого Ñода, коÑоÑÑй вÑегда вÑÑиÑлÑеÑÑÑ Ð¸Ð· дÑÑÐ³Ð¸Ñ . Таким обÑазом, Ð´Ð»Ñ ÑÑолбÑов он ÑвлÑеÑÑÑ Ñем же, Ñем пÑедÑÑавление Ð´Ð»Ñ ÑаблиÑÑ. ÐÑÑÑ Ð´Ð²Ð° Ñипа генеÑиÑÑемÑÑ ÑÑолбÑов: Ñ ÑанимÑе и виÑÑÑалÑнÑе. Ð¥ÑанимÑй генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð²ÑÑиÑлÑеÑÑÑ Ð¿Ñи запиÑи (добавлении или изменении) и Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼ÐµÑÑо в ÑаблиÑе Ñак же, как и обÑÑнÑй ÑÑолбеÑ. ÐиÑÑÑалÑнÑй генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼ÐµÑÑа и вÑÑиÑлÑеÑÑÑ Ð¿Ñи ÑÑении. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ, ÑÑо виÑÑÑалÑнÑй генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾Ñ Ð¾Ð¶ на пÑедÑÑавление, а Ñ ÑанимÑй генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ â на маÑеÑиализованное пÑедÑÑавление (за иÑклÑÑением Ñого, ÑÑо он вÑегда обновлÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки). РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² Postgres Pro ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÑолÑко Ñ ÑанимÑе генеÑиÑÑемÑе ÑÑолбÑÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑй ÑÑолбеÑ, воÑполÑзÑйÑеÑÑ Ð¿Ñедложением GENERATED ALWAYS AS ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TABLE, напÑимеÑ:
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
); ÐлÑÑевое Ñлово STORED, опÑеделÑÑÑее Ñип Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑемого ÑÑолбÑа, ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
ÐÑоизвеÑÑи запиÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в генеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½ÐµÐ»ÑзÑ. ÐоÑÑÐ¾Ð¼Ñ Ð² командаÑ
INSERT или UPDATE нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð·Ð½Ð°Ñение Ð´Ð»Ñ ÑакиÑ
ÑÑолбÑов, Ñ
оÑÑ ÐºÐ»ÑÑевое Ñлово DEFAULT ÑказаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾.
ÐÑимиÑе к ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ ÑледÑÑÑие оÑлиÑÐ¸Ñ Ð³ÐµÐ½ÐµÑиÑÑемÑÑ
ÑÑолбÑов Ð¾Ñ ÑÑолбÑов Ñо знаÑением по ÑмолÑаниÑ. ÐнаÑение ÑÑолбÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÑÑиÑлÑеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз, когда в ÑаблиÑÑ Ð²Ð¿ÐµÑвÑе вÑÑавлÑеÑÑÑ ÑÑÑока и никакое дÑÑгое знаÑение не задано; знаÑение же генеÑиÑÑемого ÑÑолбÑа Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ñи изменении ÑÑÑоки и не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделено. ÐÑÑажение знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº дÑÑгим ÑÑолбÑам ÑаблиÑÑ, а генеÑиÑÑÑÑее вÑÑажение, напÑоÑив, обÑÑно обÑаÑаеÑÑÑ Ðº ним. РвÑÑажении знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзÑваÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑивÑе ÑÑнкÑии, напÑимеÑ, random() или ÑÑнкÑии, завиÑÑÑие Ð¾Ñ Ð²Ñемени, а Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑиÑÑемÑÑ
ÑÑолбÑов ÑÑо не допÑÑкаеÑÑÑ.
С опÑеделением генеÑиÑÑемÑÑ ÑÑолбÑов и Ð¸Ñ ÑодеÑжаÑими ÑаблиÑами ÑвÑзан ÑÑд огÑаниÑений и оÑобенноÑÑей:
РгенеÑиÑÑÑÑем вÑÑажении могÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко поÑÑоÑннÑе ÑÑнкÑии и не могÑÑ ÑигÑÑиÑоваÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑÑ Ð¸Ð»Ð¸ ÑÑÑлки на какие-либо знаÑениÑ, не оÑноÑÑÑиеÑÑ Ðº данной ÑÑÑоке.
ÐенеÑиÑÑÑÑее вÑÑажение не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº дÑÑÐ³Ð¾Ð¼Ñ Ð³ÐµÐ½ÐµÑиÑÑÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ.
ÐенеÑиÑÑÑÑее вÑÑажение не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑиÑÑемнÑм ÑÑолбÑам, за иÑклÑÑением
tableoid.ÐÐ»Ñ Ð³ÐµÐ½ÐµÑиÑÑемого ÑÑолбÑа нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑвойÑÑво иденÑиÑикаÑии.
ÐенеÑиÑÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑаÑÑÑÑ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ.
ÐенеÑиÑÑемÑе ÑÑолбÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑÑÑ Ð² ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑÐ°Ñ . Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE FOREIGN TABLE.
ÐÑимениÑелÑно к наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑекÑиониÑованиÑ:
ÐÑли ÑодиÑелÑÑкий ÑÑÐ¾Ð»Ð±ÐµÑ ÑвлÑеÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑм, его доÑеÑний ÑÑÐ¾Ð»Ð±ÐµÑ Ñакже должен бÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑм; однако доÑеÑний ÑÑÐ¾Ð»Ð±ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð³ÐµÐ½ÐµÑиÑоваÑÑÑÑ Ð´ÑÑгим вÑÑажением. ÐенеÑиÑÑÑÑее вÑÑажение, коÑоÑое ÑакÑиÑеÑки пÑименÑеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÑавки или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑоки, ÑвÑзано Ñ ÑаблиÑей, в коÑоÑой ÑизиÑеÑки Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ ÑÑÑока. (ÐÑо оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑолбÑов Ñо знаÑением по ÑмолÑаниÑ: Ð´Ð»Ñ Ð½Ð¸Ñ Ð¿ÑименÑеÑÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ, коÑоÑое ÑвÑзано Ñ ÑаблиÑей, Ñказанной в запÑоÑе.)
ÐÑли ÑодиÑелÑÑкий ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑм, его доÑеÑний ÑÑÐ¾Ð»Ð±ÐµÑ Ñакже должен бÑÑÑ Ð½ÐµÐ³ÐµÐ½ÐµÑиÑÑемÑм.
ÐÐ»Ñ ÑнаÑледованнÑÑ ÑаблиÑ, еÑли в опÑеделении доÑеÑнего ÑÑолбÑа Ð½ÐµÑ Ð¿ÑедложениÑ
GENERATEDвCREATE TABLE ... INHERITS, Ñо пÑедложениеGENERATEDбÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки копиÑоваÑÑÑÑ Ð¸Ð· ÑодиÑелÑÑкого ÑÑолбÑа. ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑALTER TABLE ... INHERITÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑодиÑелÑÑкий и доÑеÑний ÑÑолбÑÑ Ñже Ñовпадали в оÑноÑении ÑоÑÑоÑÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑаÑии, но не ÑÑебÑеÑÑÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑÑÑÐ¸Ñ Ð²ÑÑажений.ÐналогиÑно Ð´Ð»Ñ ÑекÑиониÑованнÑÑ ÑаблиÑ, еÑли в опÑеделении доÑеÑнего ÑÑолбÑа Ð½ÐµÑ Ð¿ÑедложениÑ
GENERATEDвCREATE TABLE ... INHERITS, Ñо его пÑедложениеGENERATEDбÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки копиÑоваÑÑÑÑ Ñ ÑодиÑелÑÑкого ÑÑолбÑа. ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑALTER TABLE ... ATTACH PARTITIONÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑодиÑелÑÑкий и доÑеÑний ÑÑолбÑÑ Ñже Ñовпадали в оÑноÑении ÑоÑÑоÑÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑаÑии, но не ÑÑебÑÐµÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑÑÑÐ¸Ñ Ð²ÑÑажений.Ð ÑлÑÑае множеÑÑвенного наÑледованиÑ, еÑли один ÑодиÑелÑÑкий ÑÑÐ¾Ð»Ð±ÐµÑ ÑвлÑеÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑм, вÑе ÑооÑвеÑÑÑвÑÑÑие ÐµÐ¼Ñ ÑÑолбÑÑ Ð² иеÑаÑÑ Ð¸Ð¸ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑми. ÐÑли генеÑиÑÑÑÑее вÑÑажение не одинаковое Ð´Ð»Ñ Ð²ÑÐµÑ ÑÑолбÑов, Ñо желаемое вÑÑажение Ð´Ð»Ñ Ð´Ð¾ÑеÑнего ÑÑолбÑа должно бÑÑÑ Ñказано Ñвно.
ÐополниÑелÑнÑе замеÑÐ°Ð½Ð¸Ñ ÐºÐ°ÑаÑÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑемÑÑ ÑÑолбÑов.
ÐÑава доÑÑÑпа к генеÑиÑÑемÑм ÑÑолбÑам ÑÑÑеÑÑвÑÑÑ Ð¾ÑделÑно Ð¾Ñ Ð¿Ñав Ð´Ð»Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ ÑÑолбÑов. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ оÑганизоваÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделÑннÑй полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð³ пÑоÑиÑаÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑй ÑÑолбеÑ, но не нижележаÑие базовÑе ÑÑолбÑÑ.
ÐенеÑиÑÑемÑе ÑÑолбÑÑ, в ÑооÑвеÑÑÑвии Ñ ÐºÐ¾Ð½ÑепÑией, пеÑеÑÑиÑÑваÑÑÑÑ Ð¿Ð¾Ñле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑов
BEFORE. ÐÑледÑÑвие ÑÑого, в генеÑиÑÑемÑÑ ÑÑолбÑÐ°Ñ Ð±ÑдÑÑ Ð¾ÑÑажаÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, пÑоизводимÑе ÑÑиггеÑомBEFOREв базовÑÑ ÑÑолбÑÐ°Ñ , а обÑаÑаÑÑÑÑ Ð² коде Ñакого ÑÑиггеÑа к генеÑиÑÑемÑм ÑÑолбÑам, напÑоÑив, нелÑзÑ.ÐенеÑиÑÑемÑе ÑÑолбÑÑ Ð½Ðµ ÑÑаÑÑвÑÑÑ Ð² логиÑеÑкой ÑепликаÑии и не могÑÑ Ð±ÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² ÑпиÑке ÑÑолбÑов
CREATE PUBLICATION.