Серийные типы данных
Серийные типы данных представляют собой целые числа, но с дополнительным механизмом генерации значений. Эти типы данных используются для создания автоинкрементных колонок, а именно для каждой новой строки, добавляемой в таблицу, будет автоматически генерироваться уникальное значение для такой колонки (подобно типу 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;
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 |
Int16 |
|
Serial2 |
Int16 |
|
Serial |
Int32 |
|
Serial4 |
Int32 |
|
Serial8 |
Int64 |
|
BigSerial |
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.