5.3. СÑолбÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии #
СÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии â ÑÑо ÑпеÑиалÑнÑй ÑÑолбеÑ, коÑоÑÑй авÑомаÑиÑеÑки генеÑиÑÑеÑÑÑ Ð¸Ð· неÑвной поÑледоваÑелÑноÑÑи. Ðго можно иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ Ð³ÐµÐ½ÐµÑиÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии, воÑполÑзÑйÑеÑÑ Ð¿Ñедложением GENERATED ... AS IDENTITY ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TABLE, напÑимеÑ:
CREATE TABLE people (
id bigint GENERATED ALWAYS AS IDENTITY,
...,
);или
CREATE TABLE people (
id bigint GENERATED BY DEFAULT AS IDENTITY,
...,
);Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE TABLE.
ÐÑли команда INSERT вÑполнÑеÑÑÑ Ð´Ð»Ñ ÑаблиÑÑ Ñо ÑÑолбÑом иденÑиÑикаÑии, и знаÑение Ð´Ð»Ñ ÑÑого ÑÑолбÑа не Ñказано Ñвно, вÑÑавлÑеÑÑÑ Ð·Ð½Ð°Ñение, ÑгенеÑиÑованное неÑвной поÑледоваÑелÑноÑÑÑÑ. ÐапÑимеÑ, Ñ Ð¿ÑиведÑннÑми вÑÑе опÑеделениÑми и пÑи ÑÑловии налиÑÐ¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ
нÑжнÑÑ
ÑÑолбÑов
INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar'); ÑгенеÑиÑÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑа id, наÑÐ¸Ð½Ð°Ñ Ñ 1, и в ÑаблиÑе поÑвÑÑÑÑ ÑледÑÑÑие даннÑе:
id | name | address ----+------+--------- 1 | A | foo 2 | B | bar
ÐÑоме Ñого, можно Ñвно запÑоÑиÑÑ Ð·Ð½Ð°Ñение, ÑгенеÑиÑованное поÑледоваÑелÑноÑÑÑÑ, Ñказав вмеÑÑо знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑевое Ñлово DEFAULT, напÑимеÑ:
INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz'); ÐлÑÑевое Ñлово DEFAULT можно иÑполÑзоваÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑм обÑазом в командаÑ
UPDATE.
Таким обÑазом, во многом ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии ведÑÑ ÑÐµÐ±Ñ ÐºÐ°Ðº ÑÑÐ¾Ð»Ð±ÐµÑ Ñо знаÑением по ÑмолÑаниÑ.
ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ALWAYS и BY DEFAULT в опÑеделении ÑÑолбÑа ÑÑÑанавливаÑÑ, как Ñвно ÑказаннÑе полÑзоваÑелем знаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ INSERT и UPDATE. Ркоманде INSERT, в ÑлÑÑае вÑбоÑа ALWAYS, полÑзоваÑелÑÑкое знаÑение пÑинимаеÑÑÑ, ÑолÑко еÑли в ÑÑой команде Ñказано OVERRIDING SYSTEM VALUE. С пÑедложением BY DEFAULT полÑзоваÑелÑÑÐºÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾ÑдаÑÑÑÑ Ð¿ÑедпоÑÑение. Таким обÑазом, поведение Ñ BY DEFAULT поÑ
оже на поведение Ñ Ð¸ÑполÑзованием знаÑений по ÑмолÑаниÑ, когда Ñакие знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкими, Ñогда как ALWAYS обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð·Ð°ÑиÑÑ Ð¾Ñ ÑлÑÑайного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑениÑ.
Тип даннÑÑ ÑÑолбÑа иденÑиÑикаÑии должен поддеÑживаÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми (Ñм. CREATE SEQUENCE). СвойÑÑва ÑвÑзанной поÑледоваÑелÑноÑÑи могÑÑ Ð±ÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð¿Ñи Ñоздании ÑÑолбÑа иденÑиÑикаÑии (Ñм. CREATE TABLE) или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ (Ñм. ALTER TABLE).
СÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии авÑомаÑиÑеÑки помеÑаеÑÑÑ ÐºÐ°Ðº NOT NULL, однако ÑникалÑноÑÑÑ Ð·Ð½Ð°Ñений не гаÑанÑиÑÑеÑÑÑ. (ÐбÑÑно поÑледоваÑелÑноÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑникалÑнÑе знаÑениÑ, но она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑбÑоÑена или знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð²ÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии вÑÑÑнÑÑ, как опиÑано вÑÑе.) УникалÑноÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ обеÑпеÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ PRIMARY KEY или UNIQUE.
РиеÑаÑÑ
ии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ ÑÑолбÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии и иÑ
ÑвойÑÑва в доÑеÑней ÑаблиÑе не завиÑÑÑ Ð¾Ñ ÑÑолбÑов и ÑвойÑÑв в ÑодиÑелÑÑкой ÑаблиÑе. ÐоÑеÑнÑÑ ÑаблиÑа не наÑледÑÐµÑ ÑÑолбÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии или иÑ
ÑвойÑÑва авÑомаÑиÑеÑки Ð¾Ñ ÑодиÑелÑÑкой. Ðо вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ INSERT или UPDATE ÑÑÐ¾Ð»Ð±ÐµÑ ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии, еÑли он ÑвлÑеÑÑÑ ÑÑолбÑом иденÑиÑикаÑии в ÑаблиÑе, Ñказанной в опеÑаÑоÑе, и пÑименÑÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑие ÑвойÑÑва иденÑиÑикаÑии.
СекÑии наÑледÑÑÑ ÑÑолбÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑии из ÑекÑиониÑованной ÑаблиÑÑ. У Ð½Ð¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑобÑÑвеннÑÑ ÑÑолбÑов иденÑиÑикаÑии. СвойÑÑва заданного ÑÑолбÑа иденÑиÑикаÑии Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ Ð²Ð¾ вÑÐµÑ ÑекÑиÑÑ Ð² иеÑаÑÑ Ð¸Ð¸ ÑекÑий.