MySQL AUTO_INCREMENT с примерами

⚡ Умное резюме

MySQL Атрибут AUTO_INCREMENT автоматически генерирует последовательные номера для числового столбца при каждой вставке строки. Этот атрибут избавляет от необходимости вручную вычислять уникальные идентификаторы, что делает его стандартным способом заполнения первичного ключа.

  • 🔢 Основное поведение: Функция AUTO_INCREMENT присваивает следующий порядковый номер при каждой вставке новой строки, начиная с 1 и шага 1.ping по 1.
  • 🔑 Основная ключевая роль: Этот атрибут гарантирует уникальный идентификатор без запроса на поиск, поэтому он является стандартным выбором для суррогатного первичного ключа.
  • 🧱 Требования к столбцам: Столбец должен быть целочисленного типа и иметь индекс, чему уже удовлетворяет объявление PRIMARY KEY.
  • Вставить шаблон: Исключите столбец с идентификатором из оператора INSERT и MySQL Если вставить значение, функция LAST_INSERT_ID() его вернет.
  • 🎚️ Пользовательское начальное значение: Операторы CREATE TABLE или ALTER TABLE принимают значение AUTO_INCREMENT = 10, чтобы начать последовательность с выбранного числа.
  • 🕳️ Ожидайте пробелов: Удаленные строки и отмененные транзакции навсегда извлекают данные из последовательности, поэтому она остается уникальной, но не непрерывной.

MySQL АВТОМАТИЧЕСКОЕ ПРИРАЩЕНИЕ

Что такое автоинкремент?

Автоинкремент — это функция, которая работает с числовыми типами данных. Он автоматически генерирует последовательные числовые значения каждый раз, когда запись вставляется в таблицу для поля, определенного как автоматическое приращение.

Этот атрибут работает с любым целочисленным типом, от TINYINT до BIGINT. Столбец также должен быть проиндексирован, что происходит автоматически при его объявлении в качестве первичного ключа.

Когда использовать автоматическое увеличение?

В уроке по нормализация базы данныхМы рассмотрели, как можно хранить данные с минимальной избыточностью, размещая их во множестве небольших таблиц, связанных друг с другом первичными и внешними ключами.

MySQL AUTO_INCREMENT с примерами

Первичный ключ должен быть уникальным, поскольку он однозначно идентифицирует строку в базе данных. Но как гарантировать, что первичный ключ всегда будет уникальным?

Одним из возможных решений может быть использование формулы для генерации первичного ключа, которая проверяет наличие ключа в таблице перед добавлением данных. Это может сработать, но такой подход сложен и не является абсолютно надежным. Две сессии, выполняющие вставку данных в один и тот же момент, все равно могут считать одно и то же максимальное значение и вызвать конфликт.

Чтобы избежать такой сложности и гарантировать уникальность первичного ключа, мы можем использовать MySQL Функция автоинкремента используется для генерации первичных ключей. Автоинкремент применяется к типу данных INT. Тип данных INT поддерживает как знаковые, так и беззнаковые значения. Беззнаковые типы данных могут содержать только положительные числа. В качестве рекомендации рекомендуется установить ограничение на беззнаковые значения для автоинкрементного первичного ключа.

Синтаксис автоматического увеличения

Разобравшись с причинами, взгляните на скрипт, использованный для создания таблицы категорий фильмов.

CREATE TABLE `categories` (
  `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `category_name` varchar(150) DEFAULT NULL,
  `remarks` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
);

Обратите внимание на параметр «AUTO_INCREMENT» в поле category_id. Это приводит к автоматической генерации идентификатора категории каждый раз при добавлении новой строки в таблицу. При вставке данных в таблицу он не указывается. MySQL генерирует его.

Примечание: Ключевое слово UNSIGNED удваивает положительный диапазон столбца, а ширина отображения, ранее записанная как int(11), устарела с MySQL Начиная с 8.0.17. Простой Int это текущая форма.

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

Давайте рассмотрим текущее содержимое таблицы категорий.

SELECT * FROM `categories`;

Выполнение приведенного выше сценария в MySQL При использовании Workbench для работы с базой данных myflixdb мы получаем следующие результаты.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL

Существует восемь строк, поэтому следующий сгенерированный идентификатор должен быть равен 9. Теперь давайте вставим новую категорию в таблицу категорий, указав только название.

INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');

Выполнение приведенного выше сценария для myflixdb в MySQL верстак дает нам следующие результаты, показанные ниже.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL
9 Cartoons NULL

Обратите внимание, что мы не указали идентификатор категории. MySQL Сгенерировано автоматически, поскольку идентификатор категории определен как автоматически увеличивающийся.

Если вы хотите получить последний идентификатор вставки, сгенерированный MySQL, для этого вы можете использовать функцию LAST_INSERT_ID. Показанный ниже скрипт получает последний сгенерированный идентификатор.

SELECT LAST_INSERT_ID();

Выполнение приведенного выше скрипта позволяет получить последний автоматически увеличивающийся номер, сгенерированный запросом INSERT. Результаты показаны ниже.

MySQL АВТОМАТИЧЕСКОЕ ПРИРАЩЕНИЕ

Наконечник: Функция LAST_INSERT_ID() ограничена областью действия вашего собственного соединения, поэтому значение, сгенерированное при вставке другим пользователем, никогда не будет возвращено вам по ошибке.

Как установить или сбросить начальное значение AUTO_INCREMENT

Последовательность по умолчанию начинается с 1, но это не всегда соответствует потребностям проекта. Номера счетов-фактур, возможно, придется сохранить из устаревшей системы, а тестовую таблицу часто приходится сбрасывать. MySQL Это позволяет напрямую использовать счетчик, поэтому оба случая обрабатываются одним условием. Выполните следующие шаги, чтобы управлять начальным числом.

  1. Установите значение при создании. Добавьте предложение AUTO_INCREMENT к оператору CREATE TABLE. В этом случае первая вставляемая строка получит этот номер вместо 1.
  2. Изменить значение в существующей таблице. Используйте ALTER TABLE с тем же пунктом. MySQL Принимает новый номер только в том случае, если он больше, чем наибольший идентификатор, хранящийся в данный момент.
  3. Сбросьте настройки очищенной таблицы. Операция TRUNCATE TABLE удаляет все строки и возвращает счетчик к 1 за одну операцию, чего не делает операция DELETE.
  4. Подтвердите изменение. Вставьте строку и считайте идентификатор с помощью функции LAST_INSERT_ID(), прежде чем полагаться на новую последовательность.
-- Start a brand-new table at 1000
CREATE TABLE `invoices` (
  `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `amount` decimal(10,2),
  PRIMARY KEY (`invoice_id`)
) AUTO_INCREMENT = 1000;

-- Move the counter on an existing table
ALTER TABLE `categories` AUTO_INCREMENT = 100;

-- Empty the table and reset the counter to 1
TRUNCATE TABLE `categories`;

Шаг изменения также можно изменить с помощью системной переменной auto_increment_increment, но он применяется ко всему серверу, а не к одной таблице. Он используется в основном в репликации, где два сервера не должны генерировать одинаковый идентификатор.

Почему в последовательности AUTO_INCREMENT появляются пробелы?

Рано или поздно в таблице появляются идентификаторы типа 1, 2, 5, 6. Ничего не сломано. Счетчик предназначен для обеспечения уникальности, а не для обеспечения непрерывной последовательности чисел, и он никогда не выдает одно и то же значение дважды.

Пробелы возникают по следующим причинам.

  • Удаленные строки: При удалении строки из таблицы ее автоматически увеличивающийся идентификатор не используется повторно. MySQL продолжает последовательно генерировать новые числа.
  • Отменённые транзакции: Номер считается занятым в момент выполнения операции вставки. Если транзакция откатывается, строка исчезает, но номер уже использован.
  • Неудачные вставки: Оператор, отклоненный из-за ограничения UNIQUE, все еще может использовать идентификатор до того, как произойдет ошибка.
  • Вставки для оптовой продажи: InnoDB может зарезервировать блок чисел для вставки нескольких строк и отбросить те, которые не используются.

Попытка устранить эти пробелы — ошибка. Перенумерация строк нарушает работу всех внешних ключей, указывающих на них, а само значение не имеет никакого бизнес-смысла. Если отчету нужен непрерывный список, генерируйте номер строки в запросе, а не перезаписывайте сохраненные данные.

Часто задаваемые вопросы (FAQ)

№ MySQL Допускается ровно один столбец с параметром AUTO_INCREMENT на таблицу, и этот столбец должен быть проиндексирован. Объявление его в качестве первичный ключ удовлетворяет требованиям индекса.

Вставка завершается ошибкой дублирования ключа, поскольку счетчик не может превысить максимальное значение типа данных. Беззнаковый тип TINYINT останавливается на значении 255. Измените тип столбца на более широкий, например, BIGINT, до достижения этой отметки.

Да из MySQL Начиная с версии 8.0, InnoDB записывает счетчик в журнал повторного выполнения, поэтому он восстанавливается после перезапуска. В более ранних версиях он пересчитывался и мог повторно выдавать значения, освобожденные в результате удалений.

Частично. Искусственный интеллект, встроенный в такие инструменты, как... MySQL Верстак Предложите беззнаковое целое число достаточной ширины для описываемого вами объема. Оценка будет точной только при наличии предоставленных вами данных о темпах роста, поэтому проверьте ее.

Часто — да. Искусственные интеллекты-помощники при обработке запросов указывают на отмененные транзакции и сбои. ВСТАВИТЬ Обычными причинами являются ошибки в работе серверных приложений и удаленные строки. Рассматривайте это объяснение как отправную точку и сопоставьте его с логами сервера.

Подведем итог этой публикации следующим образом: