Spec-Zone.ru › MySQL 9.2

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() или функции C API. Эти функции специфичны для соединения, поэтому их возвращаемые значения не затрагиваются другим соединением, которое также выполняет вставки.

Используйте наименьший целочисленный тип данных для столбца 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-prefix. Это полезно, когда вы хотите поместить данные в упорядоченные группы.

    CREATE 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 повторно используются, если вы удаляете строку с наибольшим значением в любой группе. Это происходит даже для таблиц 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.21, «Оператор CREATE TABLE» и раздел 15.1.9, «Оператор ALTER TABLE».

  • Как ведет себя AUTO_INCREMENT в зависимости от режима SQL NO_AUTO_VALUE_ON_ZERO: раздел 7.1.11, «Режимы SQL сервера».

  • Как использовать функцию LAST_INSERT_ID() для поиска строки, содержащей последнее значение AUTO_INCREMENT: раздел 14.15, «Функции информации».

  • Установление значения AUTO_INCREMENT для использования: раздел 7.1.8, «Системные переменные сервера».

  • раздел 17.6.1.6, «Обработка AUTO_INCREMENT в InnoDB»

  • 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/example-auto-increment.html

Spec-Zone.ru

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