MySQL AUTO_INCREMENT с примери

⚡ Умно обобщение

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

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

MySQL АВТОМАТИЧНО УВЕЛИЧАВАНЕ

Какво е автоматично увеличение?

Auto Increment е функция, която работи с числови типове данни. Той автоматично генерира последователни числови стойности всеки път, когато запис е вмъкнат в таблица за поле, дефинирано като автоматично нарастване.

Атрибутът работи с всеки целочислен тип, от 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 може да резервира блок от числа за вмъкване на няколко реда и да изхвърли тези, които не използва.

Опитът да се затворят тези празнини е грешка. Преномерирането на редове нарушава всеки външен ключ, който сочи към тях, и самата стойност не носи бизнес смисъл. Ако даден отчет се нуждае от непрекъснат списък, генерирайте номера на реда в заявката, вместо да пренаписвате съхранените данни.

Въпроси и Отговори

Не. MySQL позволява точно една колона AUTO_INCREMENT на таблица и тази колона трябва да бъде индексирана. Декларирането ѝ като първичен ключ отговаря на изискването за индекс.

Вмъкванията се провалят с грешка за дублиран ключ, защото броячът не може да премине максимума на типа данни. Неподписан TINYINT спира на 255. Променете колоната на по-широк тип, например BIGINT, преди тази точка.

Да, от MySQL 8.0 и нататък. InnoDB записва брояча в лога за повторно изпълнение, така че той се възстановява след рестартиране. По-ранните версии го преизчисляваха и можеха да преиздадат числа, освободени чрез изтриване.

Частично. Асистенти за схеми на изкуствен интелект в инструменти като MySQL Workbench Предложете беззнаково цяло число, достатъчно широко за обема, който описвате. Оценката е толкова добра, колкото е и предоставената от вас цифра за растеж, така че я проверете.

Често, да. Асистентите за заявки с изкуствен интелект сочат към отменени транзакции, неуспешни INSERT оператори и изтрити редове като обичайни причини. Приемете обяснението като отправна точка и го проверете спрямо сървърните лог файлове.

Обобщете тази публикация с: