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

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

Синтаксические правила
  1. Атрибут AUTOROWID применим к типам данных SMALLINT, INT, BIGINT и только к одному столбцу таблицы.

  2. В таблице разрешен только один столбец с атрибутом AUTOROWID. Он не может иметь модификатор AUTOINC.

  3. Опция AUTOINC INITIAL применима к типам данных SMALLINT, INT, BIGINT.

  4. Атрибуты AUTOINC и PRIMARY KEY совместимы.

    Эти конструкции равнозначны:

    create or replace table tt (i int primary key autoinc);
    create or replace table tt (i int autoinc primary key);
  5. Между ключевыми словами AUTOINC и INITIAL можно вставлять допустимое по смыслу ограничение столбца, например:

    create table test (i int autoinc not null initial(0));
    create table test (i int autoinc primary key initial(0));
    create table test (i int autoinc unique initial(0));
  6. < Целочисленный литерал > в < начальном значении > может быть отрицательной величиной (за исключением максимального отрицательного значения для соответствующего целочисленного типа данных).

    Недопустимые конструкции:

    create or replace table test (i smallint autoinc initial (-32768));
    create or replace table test (i int autoinc initial (-2147483648));
Общие правила
  1. Атрибут AUTOROWID определяет < автоматическое наращивание > значения ROWID добавляемой записи.

  2. < Автоматическое наращивание > генерирует уникальное целочисленное значение столбца добавляемых в таблицу записей в диапазоне от 1 до MAXROW.

    create or replace table test (col1 int autorowid);
    insert into test;
    …
    select * from test;
    |1|
    |2|
    |3|
    …
  3. Для столбца с атрибутом AUTOROWID явно задаваемое значение столбца должно быть в пределах от 1 до MAXROWID таблицы и отличным от уже существующих ROWID (т.е. дубликаты значений в столбце с атрибутом AUTOROWID недопустимы).

  4. Значения AUTOROWID удаленных записей повторно не используются. Для их повторного использования необходимо выполнить сжатие таблицы (операция PRESS), при этом освобождаются все значения AUTOROWID.

  5. Для столбца с атрибутом AUTOROWID все значения должны совпадать с ROWID соответствующих записей таблицы.

  6. Опция AUTOINC INITIAL определяет < автоматическое наращивание > как автоматически наращиваемое значение, начинающееся со стартового < начального значения >.

  7. < Начальное значение > может быть задано в диапазоне от -(N-1) до +N, где N – максимальное значение типа данных соответствующего столбца.

  8. Если < начальное значение > не задано, по умолчанию используется 1.

  9. Шаг изменения значений AUTOINC равен 1.

    create or replace table test
    (col1 int autoinc, col2 int autoinc initial (-5));
    insert into test;
    insert into test;
    insert into test;
    select * from test;
    |1|-5|
    |2|-4|
    |3|-3|
  10. Значения AUTOINC удаленных записей повторно не используются. Для их повторного использования необходимо выполнить сжатие таблицы (операция PRESS), при этом освобождаются все значения AUTOINC.

  11. Операция UPDATE для столбца с атрибутом AUTOINC INITIAL не допустима.

  12. В операции INSERT столбцу с атрибутом AUTOINC INITIAL явно можно присваивать только такое значение, которое превышают текущее максимальное значение столбца. После этого автоматическое формирование значений столбца будет выполняться от текущего значения столбца.

    create or replace table test (col1 int autoinc, col2 int autoinc initial (-5));
    insert into test;
    insert into test;
    insert into test;
    select * from test;
    |1|-5|
    |2|-4|
    |3|-1|
    insert into test (col2) values(100);
    insert into test;
    select * from test;
    |1|-5|
    |2|-4|
    |3|-1|
    |4|100|
    |5|101|
  13. Стартовым значением автоинкрементного столбца в таблице будет числовой < литерал > из < опции умолчания > автоинкрементного поля (если опция задана) или значение автоинкрементного поля в самой первой добавленной в таблицу записи (по умолчанию 1). Допускается создавать до четырех столбцов с атрибутом AUTOINC.

    create table tab1 (i int autoinc default 10, si smallint autoinc, bi bigint autoinc default -1000);
    insert into tab1 default values;
    insert into tab1 default values;
    insert into tab1 default values;
    insert into tab1 default values;
    select * from tab1;
    | 10 | 1 | -1000 |
    | 11 | 2 | -999  |
    | 12 | 3 | -998  |
    | 13 | 4 | -997  |
  14. При попытке вставить NULL-значение в столбец с атрибутом AUTOINC ошибка не фиксируется, а вместо NULL-значения вставляется следующее по порядку автоинкрементное значение.

    create or replace table test( i int autoinc, ch char (10) );
    insert into test values(NULL, 'aaa');
    insert into test(i) values(NULL);
    insert into test(ch) values('bbb');
    insert into test(i) values(NULL);
    insert into test;
    select * from test;
    |   1| aaa |
    |   2|     |
    |   3| bbb |
    |   4|     |
    |   5|     |
  15. Атрибут AUTOINC RANGE задает диапазоны допустимых значений столбца.

  16. Атрибут AUTOINC RANGE применим к типам данных SMALLINT, INT, BIGINT и к любому допустимому количеству столбцов таблицы.

  17. Атрибут AUTOINC RANGE определяет < автоматическое наращивание > как автоматически наращиваемое значение из заданных < диапазонов > значений.

  18. В атрибуте AUTOINC RANGE < нижняя граница > < диапазона > во всех случаях должна быть меньше < верхней границы > того же < диапазона >, < нижняя граница > следующего < диапазона > больше < верхней границы > предыдущего < диапазона > (т.е. < диапазоны > должны быть упорядочены по возрастанию значений).

    create table TEST_RANGE (i int autoinc range (1:1000, 5000:10000,70000:100000));
  19. Вновь добавляемый < диапазон > не проверяется на отсутствие значений, это должен делать администратор БД, создающий его. При занесении значения по умолчанию в AUTOINC RANGE-столбец оно берется наименьшим из тех, которые больше последнего занесенного значения AUTOINC и при этом попадают в один из указанных диапазонов.

  20. В атрибуте AUTOINC RANGE количество значений столбца из одного диапазона или суммарное количество значений всех диапазонов столбца не должно превышать значение MAXROW для таблицы.

  21. Шаг изменения значений AUTOINC RANGE равен 1.

  22. Операция UPDATE для столбца с атрибутом AUTOINC RANGE не допустима.

  23. В операции INSERT столбцу с атрибутом AUTOINC RANGE явно можно присваивать только такое значение, которое входит в один из перечисленных < диапазонов >.

  24. Если таблица имеет несколько столбцов с атрибутом AUTOINC RANGE, то максимально возможное количество добавляемых записей будет равно самому минимальному из всех декларированных диапазонов.

    В такую таблицу можно добавить всего 2 записи (фиксируется код
    завершения «Переполнение инкрементного столбца»)
    create or replace table test (col1 int autoinc range (-100:-10, 0:500), col2 int autoinc range (1:2));
    insert into test;
    insert into test;
    insert into test;/* ошибка */
    select * from test;
    |1|-5|
    |2|-4|
  25. Если для столбца задано несколько < диапазонов >, то при добавлении записей сначала используются номера из первого < диапазона >, потом из второго и т.д.

  26. В операции INSERT столбцу с атрибутом AUTOINC RANGE явно можно присваивать только такое значение, которое входит в один из перечисленных < диапазонов >. После этого автоматическое формирование значений столбца будет выполняться от текущего значения этого < диапазона >.

    create or replace table test (col1 int autoinc range (-100:-10, 0:500), col2 int autoinc range (1:5));
    insert into test;
    insert into test;
    insert into test(col1) values (333);
    insert into test;
    select * from test;
    |-100|1|
    |-99 |2|
    |333 |3|
    |334 |4|
  27. Если задана конструкция RANGE, то нельзя задавать опцию INITIAL, и наоборот.

  28. При занесении явно указанного значения в AUTOINC-столбец со спецификацией RANGE оно должно быть больше последнего занесенного значения AUTOINC лишь в том случае, если попадает в один из указанных диапазонов.

  29. В случае AUTOINC без RANGE добавляемое значение может быть любым. Проверка, что вновь добавляемого значения нет в столбце, отсутствует.

  30. Запрещен выход значения по умолчанию для AUTOINC с диапазонами за границу последнего диапазона +1.

  31. Формирование значения AUTOINC для типа BIGINT отличается от INT AUTOINC и SMALLINT AUTOINC: после удаления всех записей и сжатия таблицы для INT и SMALLINT значение начинает наращиваться от заданного как INITIAL при создании таблицы, а для BIGINT – от 1.

  32. Столбцам точных числовых типов разрешается присваивать значения приближенных числовых типов. Приведение приближенного значения к точному значению выполняется путем отсечения дробной части.

    create or replace table tst(s smallint, i int, b bigint);
    insert into tst (s, i, b) values(1.05, 2.45, 3.0009);
    update tst set b=678.897;
    select * from tst;
    |1|2|678|