Доступные версии документации

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

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

Синтаксические правила
  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|
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter