Особливості роботи LAST_INSERT_ID() та AUTO_INCREMENT в MySQL - За чистий та ясний код!

Причина, за якою я написав цю статтю, — це несподівана поведінка ф-ціїLAST_INSERT_ID() при виконанні запиту в якому я в полі з атрибутомAUTO_INCREMENT передавав значення.

LAST_INSERT_ID()

І так маємо таблички

Додаємо дані, зверніть увагу на запити тут:

Чому сталася така ситуація? Розбираємо.

Які ще приколи приховує в собі ця функція, виявляється, якщо ви робите багаторазове додавання в рамках одного запиту, то ф-ціяLAST_INSERT_ID() видасть ІД тільки першому успішно доданому запису. Пруфлінк.

А якщо зробити так

Наприкінці вирішив розібрати поведінку атрибутуAUTO_INCREMENT.

AUTO_INCREMENT

Це такий атрибут, який генерує порядковий номер до вказаного поля. Полів має бути тільки з типомinteger абоfloat (TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,FLOAT ) і маєіндекс типу (UNIQUE,PRIMARY,KEY ). Причому кожен з типу поля має свою межу автоінкремента, наприклад для поляTINYINT це значення127 або255 дляTINYINT UNSIGNED і тд дивіться документацію. Кожен наступний запис буде +1 (по дефолту) до максимального числа до додавання в цьому полі, напевно не так краще сказати. У MySQL є допоміжна БДinformation_schema в якій зберігається необхідна інформація про всі таблиці всіх БД сервера. І саме там зберігатися наступний номер для автоінкремента, тобто. перед додавання запису в таблицю БД не шукає максимальний номер запису, адже на це буде витрачатися час, який дорого. У таблиці може бути тільки одне поле, яке має автоінкремент, і причому це поле неповинно мати дефолтне значення. Якщо ми хочемо вказати якийсь свій номер для поля з автоінкрементом, ми повинні просто передати цьому полю значення. Якщо значення вже є в таблиці, буде помилка якщо тип індексу в поліUNIQUE абоPRIMARY, але є тип індексуKEY то запис спокійно додасться. Якщо з якихось причин нам треба вказувати поле з автоінкрементом у запиті, але ми хочемо, щоб цьому полю було надано значення автоінкремента автоматом, то в це поле треба передати0 (нуль) абоNULL :

Якщо з якихось причин ви хочете додати значення 0 у поля автоінкремента, для цього необхідно прописати у файлі-налаштуванні (my.ini /my.cnf ) наступний рядок

Проте це не рекомендується, т.к. якщо зробити дамп БД і потім розгорнути його на іншому сервері, де немає такої настройки, дані будуть спотворені.

Якщо з якихось причин вам необхідно зробити, щоб наступний запис починався з якогось іншого числа, просто напишіть команду:

не забувайте про тип поля, щоб ваше число не вийшло за рамки.

Поміняти можна двома шляхами - тільки на час роботи сервера БД (до перезавантаження) і назавжди - зміна конфігураційного файлу

Знайшов в інтернеті цікавий сайт із подкастами. Раджу завантажити podcast, подкасти на різні теми. Також раджу послухати подкасти на сайті dev.mysql.com за тематикою цієї статті.