Spec-Zone.ru › MariaDB

AUTO_INCREMENT

Описание

Атрибут AUTO_INCREMENT может использоваться для генерации уникального идентификатора для новых строк. При вставке новой записи в таблицу (или при добавлении атрибута AUTO_INCREMENT с помощью инструкции ALTER TABLE), и поле auto_increment имеет значение NULL или DEFAULT (в случае INSERT), значение будет автоматически инкрементировано. Это также относится к значению 0, если не включён SQL_MODE NO_AUTO_VALUE_ON_ZERO.

Поля AUTO_INCREMENT по умолчанию начинаются с 1. Автоматически сгенерированное значение никогда не может быть меньше 0.

В каждой таблице может быть только одно поле AUTO_INCREMENT. Оно должно быть определено как ключевое поле (не обязательно как первичный ключ PRIMARY KEY или уникальный ключ UNIQUE). В некоторых движках хранения (включая по умолчанию InnoDB), если ключ состоит из нескольких полей, поле AUTO_INCREMENT должно быть первым полем. Движки хранения, которые разрешают размещение поля в другом месте, это Aria, MyISAM, MERGE, Spider, TokuDB, BLACKHOLE, FederatedX и Federated.

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
 );

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('fox'),('whale'),('ostrich');
SELECT * FROM animals;
+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | fox     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

SERIAL является псевдонимом для BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.

CREATE TABLE t (id SERIAL, c CHAR(1)) ENGINE=InnoDB;

SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `c` char(1) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Установка или изменение значения Auto_Increment

Вы можете использовать инструкцию ALTER TABLE для присвоения нового значения параметру таблицы auto_increment, или установить системную переменную сервера insert_id для изменения следующего значения AUTO_INCREMENT , которое будет вставлено текущей сессией.

LAST_INSERT_ID() можно использовать для просмотра последнего значения AUTO_INCREMENT , вставленного текущей сессией.

ALTER TABLE animals AUTO_INCREMENT=8;

INSERT INTO animals (name) VALUES ('aardvark');

SELECT * FROM animals;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | dog       |
|  2 | cat       |
|  3 | penguin   |
|  4 | fox       |
|  5 | whale     |
|  6 | ostrich   |
|  8 | aardvark  |
+----+-----------+

SET insert_id=12;

INSERT INTO animals (name) VALUES ('gorilla');

SELECT * FROM animals;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | dog       |
|  2 | cat       |
|  3 | penguin   |
|  4 | fox       |
|  5 | whale     |
|  6 | ostrich   |
|  8 | aardvark  |
| 12 | gorilla   |
+----+-----------+

InnoDB

До версии MariaDB 10.2.3, InnoDB использовал счетчик auto-increment, хранимый в памяти. При перезапуске сервера счетчик инициализируется наибольшим значением, использованным в таблице, что отменяет эффект любого параметра AUTO_INCREMENT = N в инструкциях таблицы.

Начиная с MariaDB 10.2.4, это ограничение снято, и AUTO_INCREMENT сохраняется.

См. также Обработка AUTO_INCREMENT в InnoDB.

Установка явных значений

Можно указать значение для поля AUTO_INCREMENT. Если ключ является первичным или уникальным, значение не должно уже существовать в ключе.

Если новое значение больше текущего максимального значения, значение AUTO_INCREMENT обновляется, поэтому следующее значение будет больше. Если новое значение меньше текущего максимального значения, значение AUTO_INCREMENT остается неизменным.

Следующий пример демонстрирует эти особенности:

CREATE TABLE t (id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE = InnoDB;

INSERT INTO t VALUES (NULL);
SELECT id FROM t;
+----+
| id |
+----+
|  1 |
+----+

INSERT INTO t VALUES (10); -- higher value
SELECT id FROM t;
+----+
| id |
+----+
|  1 |
| 10 |
+----+

INSERT INTO t VALUES (2); -- lower value
INSERT INTO t VALUES (NULL); -- auto value
SELECT id FROM t;
+----+
| id |
+----+
|  1 |
|  2 |
| 10 |
| 11 |
+----+

Движок хранения ARCHIVE не позволяет вставлять значение, меньшее текущего максимального.

Пропущенные значения

В столбце AUTO_INCREMENT обычно есть пропущенные значения. Это происходит потому, что если строка удаляется или значение AUTO_INCREMENT явно обновляется, старые значения никогда не используются повторно. Инструкция REPLACE также удаляет строку, и её значение теряется. В InnoDB значения могут быть зарезервированы транзакцией; но если транзакция завершается неудачно (например, из-за ROLLBACK), зарезервированное значение будет потеряно.

Таким образом, значения AUTO_INCREMENT можно использовать для сортировки результатов в хронологическом порядке, но не для создания числовой последовательности.

Репликация

Для обеспечения безопасности при использовании master-master или Galera репликации следует использовать системные переменные auto_increment_increment и auto_increment_offset для генерации уникальных значений для каждого сервера.

Ограничения CHECK, значения по умолчанию и виртуальные столбцы

MariaDB начиная с 10.2.6

Начиная с MariaDB 10.2.6, столбцы auto_increment больше не разрешены в ограничениях CHECK, выражениях значения по умолчанию и виртуальных столбцах. Они разрешались в более ранних версиях, но не работали корректно. См. MDEV-11117.

Генерация значений Auto_Increment при добавлении атрибута

CREATE OR REPLACE TABLE t1 (a INT);
INSERT t1 VALUES (0),(0),(0);
ALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
SELECT * FROM t1;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
+---+
CREATE OR REPLACE TABLE t1 (a INT);
INSERT t1 VALUES (5),(0),(8),(0);
ALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
SELECT * FROM t1;
+---+
| a |
+---+
| 5 |
| 6 |
| 8 |
| 9 |
+---+

Если SQL_MODE NO_AUTO_VALUE_ON_ZERO установлен, нулевые значения не будут автоматически инкрементироваться:

SET SQL_MODE='no_auto_value_on_zero';
CREATE OR REPLACE TABLE t1 (a INT);
INSERT t1 VALUES (3), (0);
ALTER TABLE t1 MODIFY a INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
SELECT * FROM t1;
+---+
| a |
+---+
| 0 |
| 3 |
+---+

См. также

  • Начало работы с индексами
  • Последовательности - альтернатива auto_increment, доступная начиная с MariaDB 10.3
  • Вопросы и ответы по AUTO_INCREMENT
  • LAST_INSERT_ID()
  • Обработка AUTO_INCREMENT в InnoDB
  • BLACKHOLE и AUTO_INCREMENT
  • UUID_SHORT() - Генерация уникальных идентификаторов
  • Генерация идентификаторов – от AUTO_INCREMENT до последовательности (percona.com)
Содержание, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержание не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в данном содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/auto_increment/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API