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