Серийные типы данных

Серийные типы данных представляют собой целые числа, но с дополнительным механизмом генерации значений. Эти типы данных используются для создания автоинкрементных колонок, а именно для каждой новой строки, добавляемой в таблицу, будет автоматически генерироваться уникальное значение для такой колонки (подобно типу SERIAL в PostgreSQL или свойству AUTO_INCREMENT в MySQL).

Пример использования

CREATE TABLE users (
    user_id Serial,
    name Utf8,
    email Utf8,
    PRIMARY KEY (user_id)
);
UPSERT INTO users (name, email) VALUES ('Alice', '[email protected]');
INSERT INTO users (name, email) VALUES ('Bob', '[email protected]');
REPLACE INTO users (name, email) VALUES ('John', '[email protected]');
SELECT * FROM users;
email name user_id
[email protected] Alice 1
[email protected] Bob 2
[email protected] John 3

Можно самостоятельно указать значение Serial колонки при вставке, в этом случае вставка будет выполняться, как с обычной целочисленной колонкой, и Sequence затрагиваться при таком запросе никак не будет:

UPSERT INTO users (user_id, name, email) VALUES (4, 'Peter', '[email protected]');

Описание

Только колонки, участвующие в первичном ключе таблиц, могут иметь тип Serial.

При определении такого типа для колонки создаётся отдельный схемный объект Sequence, привязанный к этой колонке и являющийся генератором последовательности, из которого извлекаются значения. Этот объект является приватным и скрыт от пользователя. Sequence будет уничтожен вместе с таблицей.

Значения последовательности начинаются с единицы, выдаются с шагом, равным единице, и ограничены в зависимости от используемого типа.

Тип Максимальное значение Тип значения
SmallSerial 21512^{15}–1 Int16
Serial2 21512^{15}–1 Int16
Serial 23112^{31}–1 Int32
Serial4 23112^{31}–1 Int32
Serial8 26312^{63}–1 Int64
BigSerial 26312^{63}–1 Int64

При переполнении Sequence на вставке будет возвращаться ошибка:

Error: Failed to get next val for sequence: /dev/test/users/_serial_column_user_id, status: SCHEME_ERROR
    <main>: Error: sequence [OwnerId: <some>, LocalPathId: <some>] doesn't have any more values available, code: 200503

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

Для таблиц с автоинкрементными колонками поддержаны операции copy, dump, restore и import/export.

Предыдущая
Следующая