Automatically incrementing values
В QDB каждая строка таблицы имеет 64-разрядный знаковый целочисленный идентификатор (ROWID), который уникален для строк одной таблицы.
Для доступа к идентификатору строки таблицы QDB можно использовать специальные имена столбцов "ROWID", "_ROWID_" или "OID". Тем не менее, если какое-либо из перечисленных имен присвоено обычному столбцу, это имя относится к соответствующему столбцу, а не к внутреннему идентификатору строки.
Если таблица содержит столбец типа INTEGER
PRIMARY KEY, он становится псевдонимом идентификатора строки, а для доступа к идентификатору строки можно использовать любое из трех вышеперечисленных имен или имя, которое присвоено столбцу INTEGER
PRIMARY KEY. Эти имена являются псевдонимами друг для друга и их можно использовать синонимически в любом контексте.
При вставке новой строки в таблицу QDB можно указывать ее идентификатор в операторе INSERT; в противном случае сервис присваивает его автоматически. Чтобы задать идентификатор строки вручную, достаточно включить его в список вставляемых значений:
CREATE TABLE test1( a INT, b TEXT );INSERT INTO test1( rowid, a, b ) VALUES( 123, 5, 'hello' );
Если идентификатор строки не указывается при вставке, ему автоматически присваивается подходящее значение. По умолчанию QDB присваивает новой строке идентификатор, который на единицу больше максимального идентификатора в таблице на момент, предшествующий вставке. Если таблица изначально пуста, QDB использует идентификатор строки, равный 1
. Если наибольший идентификатор строки равен максимальному целому 64-разрядному числу со знаком (9223372036854775807
), сервис выбирает случайный неиспользованный идентификатор.
Описанный выше алгоритм выбора генерирует монотонно возрастающую последовательность идентификаторов строк, если максимальный идентификатор никогда не используется, а запись с наибольшим идентификатором строки никогда не удаляется из таблицы. Если пользователь удаляет несколько строк или создает строку с максимальным идентификатором, идентификаторы удаленных строк могут повторно присваиваться новым строкам, при этом строгое соблюдение порядка возрастания не гарантируется.
Если столбец имеет тип INTEGER
PRIMARY KEY AUTOINCREMENT, применяется другой алгоритм присвоения идентификаторов строкам. Идентификатор новой строки на единицу превышает наибольший идентификатор за время существования таблицы. Если ранее в таблице не хранились какие-либо данные, сервис использует идентификатор строки, равный 1
. Если ранее в таблице существовала строка с максимальным идентификатором, дальнейшее использование операторов INSERT запрещается, а при попытке их выполнения возникает ошибка QDB_FULL
.
Для хранения наибольшего идентификатора строки за время существования таблицы в QDB предусмотрена специальная таблица с именем QDB_SEQUENCE. Она автоматически создается и инициализируется при создании обычной таблицы, которая содержит столбец AUTOINCREMENT. Можно изменять содержимое таблицы QDB_SEQUENCE с помощью обычных операторов UPDATE, INSERT и DELETE, однако следует вносить эти изменения с осторожностью, поскольку они обычно приводят к нарушению алгоритма генерации ключа AUTOINCREMENT.
Ключевое слово AUTOINCREMENT незначительно корректирует алгоритм генерации идентификаторов строк по умолчанию. Оно гарантирует, что идентификаторы, которые присваиваются строкам автоматически, ранее никогда не использовались в этой таблице базы данных и образуют монотонно возрастающую последовательность. Иногда эти нюансы важны, но если они не требуются вашему приложению, рекомендуется использовать алгоритм генерации идентификаторов строк по умолчанию. Это связано с тем, что ключевое слово AUTOINCREMENT увеличивает трудоемкость операции вставки строки, а, следовательно, несколько замедляет выполнение операторов INSERT в QDB.
Предыдущий раздел: перейти