AUTO_INCREMENT
Начиная с версии 3.0, Selena поддерживает атрибут столбца AUTO_INCREMENT, который может упростить управление данными. В этой теме рассматриваются сценарии применения, использование и функции атрибута столбца AUTO_INCREMENT.
Введение
Когда новая строка данных загружается в таблицу и значения для столбца AUTO_INCREMENT не указаны, Selena автоматически присваивает целочисленное значение для столбца AUTO_INCREMENT этой строки в качестве её уникального ID в таблице. Последующие значения для столбца AUTO_INCREMENT автоматически увеличиваются с определенным шагом, начиная с ID этой строки. Столбец AUTO_INCREMENT может использоваться для упрощения управления данными и ускорения некоторых запросов. Вот некоторые сценарии применения столбца AUTO_INCREMENT:
- Использование в качестве первичных ключей: Столбец
AUTO_INCREMENTможет использоваться в качестве первичного ключа для обеспечения уникального ID каждой строки и упрощения запросов и управления данными. - Соединение таблиц: Когда несколько таблиц соединяются, столбец
AUTO_INCREMENTможет использоваться в качестве Join Key, что может ускорить запросы по сравнению с использованием столбца типа данных STRING, например, UUID. - Подсчет количества различных значений в столбце с высокой кардинальностью: Столбец
AUTO_INCREMENTможет использоваться для представления столбца уникальных значений в словаре. По сравнению с прямым подсчетом различных значений STRING, подсчет различных целочисленных значений столбцаAUTO_INCREMENTиногда может улучшить скорость запроса в несколько раз или даже в десятки раз.
Вам нужно указать столбец AUTO_INCREMENT в операторе CREATE TABLE. Типами данных столбца AUTO_INCREMENT должен быть BIGINT. Значение для столбца AUTO_INCREMENT может быть присвоено неявно или указано явно. Оно начинается с 1 и увеличивается на 1 для каждой новой строки.
Основные операции
Указание столбца AUTO_INCREMENT при создании таблицы
Создайте таблицу с именем test_tbl1 с двумя столбцами, id и number. Укажите столбец number как столбец AUTO_INCREMENT.
CREATE TABLE test_tbl1
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
Присвоение значений для столбца AUTO_INCREMENT
Неявное присвоение значений
Когда вы загружаете данные в таблицу Selena, вам не нужно указывать значения для столбца AUTO_INCREMENT. Selena автоматически присваивает уникальные целочисленные значения для этого столбца и вставляет их в таблицу.
INSERT INTO test_tbl1 (id) VALUES (1);
INSERT INTO test_tbl1 (id) VALUES (2);
INSERT INTO test_tbl1 (id) VALUES (3),(4),(5);
Просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+------+--------+
5 rows in set (0.02 sec)
Когда вы загружаете данные в таблицу Selena, вы также можете указать значения как DEFAULT для столбца AUTO_INCREMENT. Selena автоматически присваивает уникальные целочисленные значения для этого столбца и вставляет их в таблицу.
INSERT INTO test_tbl1 (id, number) VALUES (6, DEFAULT);
Просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+--------+
6 rows in set (0.02 sec)
В реальном использовании следующий результат может быть возвращен при просмотре данных в таблице. Это происходит потому, что Selena не может гарантировать, что значения для столбца AUTO_INCREMENT строго монотонны. Но Selena может гарантировать, что значения примерно увеличиваются в хронологическом порядке. Для получени я дополнительной информации см. Монотонность.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
+------+--------+
6 rows in set (0.01 sec)
Явное указание значений
Вы также можете явно указать значения для столбца AUTO_INCREMENT и вставить их в таблицу.
INSERT INTO test_tbl1 (id, number) VALUES (7, 100);
-- просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
+------+--------+
7 rows in set (0.01 sec)
Более того, явное указание значений не влияет на последующие значения, генерируемые Selena для вновь вставленных строк данных.
INSERT INTO test_tbl1 (id) VALUES (8);
-- просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
| 8 | 2 |
+------+--------+
8 rows in set (0.01 sec)
ПРИМЕЧАНИЕ
Мы рекомендуем не использовать неявно присвоенные значения и явно указанные значения для столбца AUTO_INCREMENT одновременно. Потому что указанные значения могут быть такими же, как значения, сгенерированные Selena, что нарушает глобальную уникальность автоинкрементных ID.
Основные функции
Уникальность
В общем случае Selena гарантирует, что значения для столбца AUTO_INCREMENT глобально уникальны в таблице. Мы рекомендуем не присваивать неявно и явно указывать значения для столбца AUTO_INCREMENT одновременно. Если вы это сделаете, это может нарушить глобальную уникальность автоинкрементных ID. Вот прос той пример: Создайте таблицу с именем test_tbl2 с двумя столбцами, id и number. Укажите столбец number как столбец AUTO_INCREMENT.
CREATE TABLE test_tbl2
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
Неявно присвойте и явно укажите значения для столбца AUTO_INCREMENT number в таблице test_tbl2.
INSERT INTO test_tbl2 (id, number) VALUES (1, DEFAULT);
INSERT INTO test_tbl2 (id, number) VALUES (2, 2);
INSERT INTO test_tbl2 (id) VALUES (3);
Запросите таблицу test_tbl2.
mysql > SELECT * FROM test_tbl2 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 100001 |
+------+--------+
3 rows in set (0.08 sec)