Определение значения из последовательности
Спецификация

См. спецификацию пункта «Создание таблицы».

Синтаксические правила
  1. Опции < последовательности > аналогичны опциям создания последовательности (см. пункт «Создание последовательности»).

    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));
  2. Если опции ALWAYS, BY DEFAULT не заданы, по умолчанию используется BY DEFAULT.

  3. Задание типа данных столбца со < значениями из последовательности > является обязательным.

  4. < Значение из последовательности > разрешено задавать только для типов данных SMALLINT, INTEGER, BIGINT.

  5. При создании столбца со < значениями из последовательности > неявным образом задается NOT NULL.

  6. В таблице можно определить не более четырёх столбцов со < значениями из последовательности >.

  7. Для столбца со < значениями из последовательности > нельзя задавать ограничения AUTOINC, AUTOROWID, AUTOINC RANGE, а также DEFAULT-значения, в противном случае будет получен код завершения – 1120 («Неверное описание атрибута IDENTITY»).

  8. Значения по умолчанию атрибута < последовательность > опции 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|
  9. В < значении из последовательности > < нижняя граница > должна быть строго меньше < верхней границы >.

  10. Если в < значении из последовательности > задано < начальное значение >, то оно должно быть не больше 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));
  11. Если в < значении из последовательности > задано CYCLE, то столбец не должен иметь атрибут PRIMARY KEY или UNQUE.

Общие правила
  1. Если при определении столбца со < значениями из последовательности > указана опция 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|
  2. Для включения столбца со < значениями из последовательности > в список добавляемых (модифицируемых) столбцов без фиксации указанной выше ошибки необходимо использовать опцию 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|
  3. Если при определении столбца со < значениями из последовательности > задана опция 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|
  4. Если ни одна из опций ALWAYS и BY DEFAULT не задана, по умолчанию используется ALWAYS.

  5. Конструкция 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);
  6. Если в опции 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|