5.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 также сбрасывает последовательность AUTO_INCREMENT.
Вы можете получить последнее автоматически сгенерированное значение AUTO_INCREMENT с помощью функции SQL LAST_INSERT_ID() или функции API C. Эти функции зависят от соединения, поэтому их возвращаемые значения не зависят от другого соединения, которое также выполняет вставки.
Используйте самый маленький целочисленный тип данных для столбца AUTO_INCREMENT, который достаточно большой для хранения максимального требуемого значения последовательности. Когда столбец достигает верхнего предела типа данных, следующая попытка сгенерировать порядковый номер завершается ошибкой. Если возможно, используйте атрибут UNSIGNED, чтобы обеспечить больший диапазон. Например, если вы используете TINYINT, максимальное допустимое значение порядкового номера — 127. Для TINYINT
UNSIGNED максимальное значение — 255. См. Раздел 13.1.2, «Целочисленные типы (точное значение) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT» для диапазонов всех целочисленных типов.
При вставке нескольких строк функции LAST_INSERT_ID() фактически возвращают ключ AUTO_INCREMENT от первой из вставленных строк. Это позволяет корректно воспроизводить вставки нескольких строк на других серверах в настройке репликации.
Чтобы начать с значения AUTO_INCREMENT, отличного от 1, задайте это значение с помощью CREATE
TABLE или ALTER TABLE, как показано ниже:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
Примечания для InnoDB
Дополнительная информация об использовании AUTO_INCREMENT, специфичная для InnoDB, приведена в разделе 17.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столбцу: раздел 15.1.20, «Оператор CREATE TABLE» и раздел 15.1.9, «Оператор ALTER TABLE».Как ведёт себя
AUTO_INCREMENTв зависимости от режима SQLNO_AUTO_VALUE_ON_ZERO: раздел 7.1.11, «Режимы SQL сервера».Как использовать функцию
LAST_INSERT_ID()для поиска строки, содержащей последнее значениеAUTO_INCREMENT: раздел 14.15, «Функции информации».Установка используемого значения
AUTO_INCREMENT: раздел 7.1.8, «Системные переменные сервера».AUTO_INCREMENTи репликация: Раздел 19.5.1.1, «Репликация и AUTO_INCREMENT».Переменные системы сервера, относящиеся к
AUTO_INCREMENT(auto_increment_incrementиauto_increment_offset), которые можно использовать для репликации: Раздел 7.1.8, «Системные переменные сервера».
© 2025 Oracle
Licensed under the GPLv2 License.