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