Определение автоматически наращиваемого значения столбца
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Атрибут
AUTOROWIDприменим к типам данныхSMALLINT,INT,BIGINTи только к одному столбцу таблицы. -
В таблице разрешен только один столбец с атрибутом
AUTOROWID. Он не может иметь модификаторAUTOINC. -
Опция
AUTOINC INITIALприменима к типам данныхSMALLINT,INT,BIGINT. -
Атрибуты
AUTOINCиPRIMARY KEYсовместимы.Эти конструкции равнозначны:
create or replace table tt (i int primary key autoinc); create or replace table tt (i int autoinc primary key);
-
Между ключевыми словами
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));
-
<Целочисленный литерал>в<начальном значении>может быть отрицательной величиной (за исключением максимального отрицательного значения для соответствующего целочисленного типа данных).Недопустимые конструкции:
create or replace table test (i smallint autoinc initial (-32768)); create or replace table test (i int autoinc initial (-2147483648));
Общие правила
-
Атрибут
AUTOROWIDопределяет<автоматическое наращивание>значенияROWIDдобавляемой записи. -
<Автоматическое наращивание>генерирует уникальное целочисленное значение столбца добавляемых в таблицу записей в диапазоне от 1 до MAXROW.create or replace table test (col1 int autorowid); insert into test; … select * from test; |1| |2| |3| …
-
Для столбца с атрибутом
AUTOROWIDявно задаваемое значение столбца должно быть в пределах от1доMAXROWIDтаблицы и отличным от уже существующихROWID(т.е. дубликаты значений в столбце с атрибутомAUTOROWIDнедопустимы). -
Значения
AUTOROWIDудаленных записей повторно не используются. Для их повторного использования необходимо выполнить сжатие таблицы (операцияPRESS), при этом освобождаются все значенияAUTOROWID. -
Для столбца с атрибутом
AUTOROWIDвсе значения должны совпадать сROWIDсоответствующих записей таблицы. -
Опция
AUTOINC INITIALопределяет<автоматическое наращивание>как автоматически наращиваемое значение, начинающееся со стартового<начального значения>. -
<Начальное значение>может быть задано в диапазоне от -(N-1) до +N, где N – максимальное значение типа данных соответствующего столбца. -
Если
<начальное значение>не задано, по умолчанию используется1. -
Шаг изменения значений
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|
-
Значения
AUTOINCудаленных записей повторно не используются. Для их повторного использования необходимо выполнить сжатие таблицы (операцияPRESS), при этом освобождаются все значенияAUTOINC. -
Операция
UPDATEдля столбца с атрибутомAUTOINC INITIALне допустима. -
В операции
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|
-
Стартовым значением автоинкрементного столбца в таблице будет числовой
<литерал>из<опции умолчания>автоинкрементного поля (если опция задана) или значение автоинкрементного поля в самой первой добавленной в таблицу записи (по умолчанию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 |
-
При попытке вставить 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| | -
Атрибут
AUTOINC RANGEзадает диапазоны допустимых значений столбца. -
Атрибут
AUTOINC RANGEприменим к типам данныхSMALLINT,INT,BIGINTи к любому допустимому количеству столбцов таблицы. -
Атрибут
AUTOINC RANGEопределяет<автоматическое наращивание>как автоматически наращиваемое значение из заданных<диапазонов>значений. -
В атрибуте
AUTOINC RANGE<нижняя граница><диапазона>во всех случаях должна быть меньше<верхней границы>того же<диапазона>,<нижняя граница>следующего<диапазона>больше<верхней границы>предыдущего<диапазона>(т.е.<диапазоны>должны быть упорядочены по возрастанию значений).create table TEST_RANGE (i int autoinc range (1:1000, 5000:10000,70000:100000));
-
Вновь добавляемый
<диапазон>не проверяется на отсутствие значений, это должен делать администратор БД, создающий его. При занесении значения по умолчанию в столбецAUTOINC RANGEоно берется наименьшим из тех, которые больше последнего занесенного значенияAUTOINCи при этом попадают в один из указанных диапазонов. -
В атрибуте
AUTOINC RANGEколичество значений столбца из одного диапазона или суммарное количество значений всех диапазонов столбца не должно превышать значениеMAXROWдля таблицы. -
Шаг изменения значений
AUTOINC RANGEравен1. -
Операция
UPDATEдля столбца с атрибутомAUTOINC RANGEне допустима. -
В операции
INSERTстолбцу с атрибутомAUTOINC RANGEявно можно присваивать только такое значение, которое входит в один из перечисленных<диапазонов>. -
Если таблица имеет несколько столбцов с атрибутом
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|
-
Если для столбца задано несколько
<диапазонов>, то при добавлении записей сначала используются номера из первого<диапазона>, потом из второго и так далее. -
В операции
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|
-
Если задана конструкция
RANGE, то нельзя задавать опциюINITIAL, и наоборот. -
При занесении явно указанного значения в столбец
AUTOINCсо спецификациейRANGEоно должно быть больше последнего занесенного значенияAUTOINCлишь в том случае, если попадает в один из указанных диапазонов. -
В случае
AUTOINCбезRANGEдобавляемое значение может быть любым. Проверка, что вновь добавляемого значения нет в столбце, отсутствует. -
Запрещен выход значения по умолчанию для
AUTOINCс диапазонами за границу последнего диапазона+1. -
Формирование значения
AUTOINCдля типаBIGINTотличается отINT AUTOINCиSMALLINT AUTOINC: после удаления всех записей и сжатия таблицы дляINTиSMALLINTзначение начинает наращиваться от заданного какINITIALпри создании таблицы, а дляBIGINT– от1. -
Столбцам точных числовых типов разрешается присваивать значения приближенных числовых типов. Приведение приближенного значения к точному значению выполняется путем отсечения дробной части.
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|