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) VALUE ('A', 'foo');
INSERT INTO people (name, address) VALUE ('B', 'bar');

сгенерирует значения для столбца id, начиная с 1, и в таблице появятся следующие данные:

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

Кроме того, можно явно запросить значение, сгенерированное последовательностью, указав вместо значения ключевое слово DEFAULT, например:

INSERT INTO people (id, name, address) VALUE (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 столбец рассматривается как столбец идентификации, если он является столбцом идентификации в таблице, указанной в операторе, и применяются соответствующие свойства идентификации.

Секции наследуют столбцы идентификации из секционированной таблицы. У них не может быть собственных столбцов идентификации. Свойства заданного столбца идентификации одинаковы во всех секциях в иерархии секций.