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