|
| 1 | +# Серийные типы данных |
| 2 | + |
| 3 | +Серийные типы данных представляют собой целые числа, но с дополнительным механизмом генерации значений. Эти типы данных используются для создания автоинкрементных колонок, а именно для каждой новой строки, добавляемой в таблицу, будет автоматически генерироваться уникальное значение для такой колонки (подобно типу [SERIAL](https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL) в PostgreSQL или свойству [AUTO_INCREMENT](https://dev.mysql.com/doc/refman/9.0/en/example-auto-increment.html) в MySQL). |
| 4 | + |
| 5 | +## Пример использования |
| 6 | + |
| 7 | +``` yql |
| 8 | +CREATE TABLE users ( |
| 9 | + user_id Serial, |
| 10 | + name Utf8, |
| 11 | + email Utf8, |
| 12 | + PRIMARY KEY (user_id) |
| 13 | +); |
| 14 | +``` |
| 15 | + |
| 16 | +``` yql |
| 17 | +UPSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'); |
| 18 | +INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com'); |
| 19 | +REPLACE INTO users (name, email) VALUES ('John', 'john@example.com'); |
| 20 | +``` |
| 21 | + |
| 22 | +``` yql |
| 23 | +SELECT * FROM users; |
| 24 | +``` |
| 25 | + |
| 26 | +email | name | user_id |
| 27 | +----- | ----- | ----- |
| 28 | +`alice@example.com` | Alice | 1 |
| 29 | +`bob@example.com` | Bob | 2 |
| 30 | +`john@example.com` | John | 3 |
| 31 | + |
| 32 | +Можно самостоятельно указать значение `Serial` колонки при вставке, в этом случае вставка будет выполняться, как с обычной целочисленной колонкой и `Sequence` затрагиваться при таком запросе никак не будет: |
| 33 | + |
| 34 | +``` yql |
| 35 | +UPSERT INTO users (user_id, name, email) VALUES (4, 'Peter', 'peter@example.com'); |
| 36 | +``` |
| 37 | + |
| 38 | +## Описание |
| 39 | + |
| 40 | +Только колонки, участвующие в первичном ключе таблиц, могут иметь тип `Serial`. |
| 41 | + |
| 42 | +При определении такого типа для колонки создаётся отдельный схемный объект `Sequence`, привязанный к этой колонке и являющийся генератором последовательности, из которого извлекаются значения. Этот объект является приватным и скрыт от пользователя. `Sequence` будет уничтожен вместе с таблицей. |
| 43 | + |
| 44 | +Значения последовательности начинаются с единицы, выдаются с шагом, равным единице, и ограничены в зависимости от используемого типа. |
| 45 | + |
| 46 | +Тип | Максимальное значение | Тип значения |
| 47 | +----- | ----- | ----- |
| 48 | +`SmallSerial` | $2^15–1$ | `Int16` |
| 49 | +`Serial2` | $2^15–1$ | `Int16` |
| 50 | +`Serial` | $2^31–1$ | `Int32` |
| 51 | +`Serial4` | $2^31–1$ | `Int32` |
| 52 | +`Serial8` | $2^63–1$ | `Int64` |
| 53 | +`BigSerial` | $2^63–1$ | `Int64` |
| 54 | + |
| 55 | +При переполнении `Sequence` на вставке будет возвращаться ошибка: |
| 56 | + |
| 57 | +```text |
| 58 | +Error: Failed to get next val for sequence: /dev/test/users/_serial_column_user_id, status: SCHEME_ERROR |
| 59 | + <main>: Error: sequence [OwnerId: <some>, LocalPathId: <some>] doesn't have any more values available, code: 200503 |
| 60 | +``` |
| 61 | + |
| 62 | +Отметим, что следующее значение выдаётся генератором до непосредственной вставки в таблицу и уже будет считаться использованным, даже если строка, содержащая это значение, не была успешно вставлена, например, при откате транзакции. Поэтому множество значений такой колонки может содержать пропуски и состоять из нескольких промежутков. |
| 63 | + |
| 64 | +Для таблиц с автоинкрементными колонками поддержаны операции [copy](../../../../reference/ydb-cli/tools-copy.md), [dump](../../../../reference/ydb-cli/export-import/tools-dump.md), [restore](../../../../reference/ydb-cli/export-import/import-file.md) и [import](../../../../reference/ydb-cli/export-import/import-s3.md)/[export](../../../../reference/ydb-cli/export-import/export-s3.md). |
0 commit comments