Определение значения из последовательности
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Опции
< последовательности >аналогичны опциям создания последовательности (см. пункт «Создание последовательности»).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|