Определение значения из последовательности
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Опции
< последовательности >
аналогичны опциям создания последовательности (см. пункт «Создание последовательности»).create or replace table parts( part_no integer generated as identity (start with 1 increment by -2 minvalue -100000 maxvalue 100000) unique, part_descr varchar (20), part_quantity integer); create or replace table tst (name char(10), "№ п/п" int GENERATED as identity (start with 1 increment by 1 maxvalue 1000));
-
Если опции ALWAYS, BY DEFAULT не заданы, по умолчанию используется BY DEFAULT.
-
Задание типа данных столбца со
< значениями из последовательности >
является обязательным. -
< Значение из последовательности >
разрешено задавать только для типов данных SMALLINT, INTEGER, BIGINT. -
При создании столбца со
< значениями из последовательности >
неявным образом задается NOT NULL. -
В таблице можно определить не более четырёх столбцов со
< значениями из последовательности >
. -
Для столбца со
< значениями из последовательности >
нельзя задавать ограничения AUTOINC, AUTOROWID, AUTOINC RANGE, а также DEFAULT-значения, в противном случае будет получен код завершения – 1120 («Неверное описание атрибута IDENTITY»). -
Значения по умолчанию атрибута
< последовательность >
опции GENERATED [ALWAYS|BY DEFAULT] AS IDENTITY:-
< начальное значение >
:1
; -
< шаг >
:1
; -
< верхняя граница >
: MAXROW; -
< нижняя граница >
:1
; -
NO CYCLE.
create or replace table test (col1 int generated always as identity ()); insert into test; insert into test; select * from test; |1| |2|
-
-
В
< значении из последовательности >
< нижняя граница >
должна быть строго меньше< верхней границы >
. -
Если в
< значении из последовательности >
задано< начальное значение >
, то оно должно быть не больше MAXROW и быть в диапазоне MINVALUE: MAXVALUE (если заданы эти атрибуты), либо в диапазоне допустимых значений соответствующего типа данных столбца.create or replace table test (col1 smallint generated always as identity (START WITH 128 NOMAXVALUE)); Ошибочная конструкция create or replace table test (col1 smallint generated always as identity (START WITH 65538 NOMAXVALUE));
-
Если в
< значении из последовательности >
задано CYCLE, то столбец не должен иметь атрибут PRIMARY KEY или UNQUE.
Общие правила
-
Если при определении столбца со
< значениями из последовательности >
указана опция ALWAYS, то в операциях добавления и модификации записей всегда будет использоваться извлекаемое из< последовательности >
значение. Попытка присвоить столбцу собственное значение вызовет ошибку.create or replace table tst (name char(10), "№ п/п" int GENERATED always as identity (start with 1 increment by 1 maxvalue 1000)); insert into tst ("№ п/п", name) values (default, '11111'); insert into tst (name) values ('22222'); insert into tst (name) values ('33333'); insert into tst ("№ п/п", name) values (default, '44444'); insert into tst ("№ п/п", name) values (100, '55555'); /* ошибка */ select * from tst; |11111 | 1| |22222 | 2| |33333 | 3| |44444 | 4|
-
Для включения столбца со
< значениями из последовательности >
в список добавляемых (модифицируемых) столбцов без фиксации указанной выше ошибки необходимо использовать опцию DEFAULT.create or replace table tst (name char(10), "№ п/п" int GENERATED by default as identity (start with 1 increment by 1 maxvalue 1000)); insert into tst ("№ п/п", name) values (100, '11111'); insert into tst (name) values ('22222'); insert into tst (name) values ('33333'); insert into tst ("№ п/п", name) values (default, '44444'); insert into tst ("№ п/п", name) values (200, '5555'); select * from tst; |11111 | 100| |22222 | 1| |33333 | 2| |44444 | 3| |55555 | 200|
-
Если при определении столбца со
< значениями из последовательности >
задана опция BY DEFAULT, то в операциях добавления и модификации записей выбираемое из< последовательности >
значение будет использоваться только в тех случаях, когда не задано явное значение.Примеры. а) create or replace table tst (name char(10), "№ п/п" int GENERATED by default as identity (start with 1 increment by 1 maxvalue 1000)); insert into tst ("№ п/п", name) values (100, '11111'); insert into tst (name) values ('22222'); insert into tst (name) values ('33333'); insert into tst ("№ п/п", name) values (400, '44444'); select * from tst; |11111 | 100| |22222 | 1| |33333 | 2| |44444 | 400| б) create or replace table test (col1 int generated by default as identity (start with 15 maxvalue 100 minvalue -100)); insert into test; insert into test; select * from test |15| |16|
-
Если ни одна из опций ALWAYS и BY DEFAULT не задана, по умолчанию используется ALWAYS.
-
Конструкция GENERATED ALWAYS AS IDENTITY (
< последовательность >
) подставляет всегда текущее значение< последовательности >
в столбец добавляемой (модифицируемой) записи, поэтому в операторе добавления/модификации данных нельзя указывать значение добавляемого/модифицируемого столбца; добавляемое/модифицируемое значение должно отсутствовать или заменено фразой «default», иначе будет фиксироваться ошибка.create or replace table test (col1 int generated always as identity (start with 35 maxvalue 100 minvalue -100)); insert into test; insert into test; insert into test(col1) values (default); select * from test; |35| |36| |37| Ошибочная конструкция insert into test(col1) values (66);
-
Если в опции GENERATED [ALWAYS|BY DEFAULT] AS IDENTITY задан атрибут CYCLE, то после исчерпания значений
< последовательности >
значения столбцов добавляемых модифицируемых) записей будут повторяться в соответствии с первоначальными параметрами< последовательности >
.create or replace table test (col1 int generated always as identity (start with 1 increment by 3 maxvalue 5 minvalue 1 cycle)); insert into test default values; insert into test default values; insert into test default values; insert into test default values; select * from test; |1| |4| |1| |4|