3.6.9 Использование AUTO_INCREMENT
Атрибут AUTO_INCREMENT может использоваться для генерации уникального идентификатора для новых строк:
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'),
('lax'),('whale'),('ostrich');
SELECT * FROM animals;
Что возвращает:
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
Значение для столбца AUTO_INCREMENT не было указано, поэтому MySQL автоматически назначил порядковые номера. Вы также можете явно задать 0 для столбца, чтобы сгенерировать порядковые номера, если не включён режим SQL NO_AUTO_VALUE_ON_ZERO. Например:
INSERT INTO animals (id,name) VALUES(0,'groundhog');
Если столбец объявлен NOT NULL, также возможно задать NULL для столбца, чтобы сгенерировать порядковые номера. Например:
INSERT INTO animals (id,name) VALUES(NULL,'squirrel');
При вставке любого другого значения в столбец AUTO_INCREMENT, столбец устанавливается на это значение, а последовательность сбрасывается, так что следующее автоматически сгенерированное значение следует последовательно за наибольшим значением столбца. Например:
INSERT INTO animals (id,name) VALUES(100,'rabbit');
INSERT INTO animals (id,name) VALUES(NULL,'mouse');
SELECT * FROM animals;
+-----+-----------+
| id | name |
+-----+-----------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
| 7 | groundhog |
| 8 | squirrel |
| 100 | rabbit |
| 101 | mouse |
+-----+-----------+
Обновление существующего значения столбца AUTO_INCREMENT в таблице InnoDB не сбрасывает последовательность AUTO_INCREMENT, как это происходит для таблиц MyISAM и NDB.
Вы можете получить последнее автоматически сгенерированное значение AUTO_INCREMENT с помощью функции SQL LAST_INSERT_ID() или функции C API. Эти функции специфичны для соединения, поэтому их возвращаемые значения не затрагиваются другим соединением, также выполняющим вставки.
Используйте наименьший целочисленный тип данных для столбца AUTO_INCREMENT, который достаточно велик для хранения максимального значения последовательности, необходимого вам. Когда столбец достигает верхнего предела типа данных, следующая попытка сгенерировать порядковый номер завершается неудачей. Если возможно, используйте атрибут UNSIGNED, чтобы разрешить больший диапазон. Например, если вы используете TINYINT, максимальный допустимый порядковый номер составляет 127. Для TINYINT
UNSIGNED максимальное значение составляет 255. См. Раздел 11.1.2 «Целочисленные типы (точные значения) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT» для диапазонов всех целочисленных типов.
При вставке нескольких строк функции LAST_INSERT_ID() на самом деле возвращают первичный ключ от первой вставленной строки. Это позволяет правильно воспроизводить вставки нескольких строк на других серверах в настройке репликации.
Чтобы начать с значения AUTO_INCREMENT, отличного от 1, установите это значение с помощью CREATE
TABLE или ALTER TABLE, например так:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
Примечания InnoDB
Дополнительную информацию об использовании AUTO_INCREMENT, специфичном для InnoDB, см. в Разделе 14.6.1.6 «Обработка AUTO_INCREMENT в InnoDB».
Примечания MyISAM
-
Для таблиц
MyISAMвы можете указатьAUTO_INCREMENTдля дополнительного столбца в индексе с несколькими столбцами. В этом случае сгенерированное значение для столбцаAUTO_INCREMENTрассчитывается какMAX(. Это полезно, когда вы хотите разместить данные в упорядоченных группах.auto_increment_column) + 1 WHERE prefix=given-prefixCREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id;Что возвращает:
+--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+
В этом случае (когда столбец
AUTO_INCREMENTявляется частью индекса с несколькими столбцами), значенияAUTO_INCREMENTповторно используются, если вы удаляете строку с наибольшим значениемAUTO_INCREMENTв любой группе. Это происходит даже для таблицMyISAM, для которых значенияAUTO_INCREMENTобычно не повторно используются. Если столбец
AUTO_INCREMENTявляется частью нескольких индексов, MySQL генерирует значения последовательности, используя индекс, который начинается со столбцаAUTO_INCREMENT, если такой есть. Например, если таблицаanimalsсодержала индексыPRIMARY KEY (grp, id)иINDEX (id), MySQL бы игнорировалPRIMARY KEYпри генерации значений последовательности. В результате таблица будет содержать одну последовательность, а не последовательность на каждое значениеgrp.
Дополнительная информация
Дополнительную информацию об AUTO_INCREMENT можно найти здесь:
Как присвоить атрибут
AUTO_INCREMENTстолбцу: Раздел 13.1.18 «Оператор CREATE TABLE» и Раздел 13.1.8 «Оператор ALTER TABLE».Как
AUTO_INCREMENTведёт себя в зависимости от режима SQLNO_AUTO_VALUE_ON_ZERO: Раздел 5.1.10 «Режимы SQL сервера».Как использовать функцию
LAST_INSERT_ID()для поиска строки, содержащей последнее значениеAUTO_INCREMENT: Раздел 12.15 «Функции информации».Установка значения
AUTO_INCREMENTдля использования: Раздел 5.1.7 «Системные переменные сервера».AUTO_INCREMENTи репликация: Раздел 16.4.1.1 «Репликация и AUTO_INCREMENT».Системные переменные сервера, относящиеся к
AUTO_INCREMENT(auto_increment_incrementиauto_increment_offset), которые могут использоваться для репликации: Раздел 5.1.7 «Системные переменные сервера».
© 2025 Oracle
Licensed under the GPLv2 License.