MySQL AUTO_INCREMENT z przykładami

⚡ Inteligentne podsumowanie

MySQL Funkcja AUTO_INCREMENT automatycznie generuje kolejne numery dla kolumny numerycznej za każdym razem, gdy wstawiany jest wiersz. Atrybut ten eliminuje konieczność ręcznego obliczania unikatowych identyfikatorów, co czyni go standardowym sposobem wypełniania klucza podstawowego.

  • 🔢 Podstawowe zachowanie: Funkcja AUTO_INCREMENT wydaje kolejny numer w sekwencji za każdym razem, gdy wstawiany jest nowy wiersz, zaczynając od 1 i krokuping przez 1.
  • 🔑 Podstawowa rola kluczowa: Atrybut ten gwarantuje unikatowy identyfikator bez konieczności wyszukiwania, dlatego jest standardowym wyborem dla zastępczego klucza podstawowego.
  • 🧱 Wymagania dotyczące kolumn: Kolumna musi być typu całkowitego i musi być indeksowana, co spełnia deklaracja PRIMARY KEY.
  • Wstaw wzór: Pomiń kolumnę identyfikatora w poleceniu INSERT i MySQL dostarcza wartość, a następnie LAST_INSERT_ID() ją zwraca.
  • 🎚️ Niestandardowa wartość początkowa: Polecenie CREATE TABLE lub ALTER TABLE akceptuje wartość AUTO_INCREMENT = 10, aby rozpocząć sekwencję od wybranej liczby.
  • 🕳️. Spodziewane luki: Usunięte wiersze i wycofane transakcje powodują trwałe zużycie liczb, więc sekwencja pozostaje unikatowa, ale nie jest ciągła.

MySQL AUTO_INCREMENT

Co to jest automatyczny przyrost?

Auto Increment to funkcja, która działa na typach danych numerycznych. Automatycznie generuje sekwencyjne wartości numeryczne za każdym razem, gdy rekord jest wstawiany do tabeli dla pola zdefiniowanego jako auto increment.

Atrybut działa dla dowolnego typu całkowitego, od TINYINT do BIGINT. Kolumna musi być również indeksowana, co odbywa się automatycznie po jej zadeklarowaniu jako klucza podstawowego.

Kiedy używać automatycznego zwiększania?

Na lekcji o normalizacja bazy danychprzyjrzeliśmy się sposobowi przechowywania danych z minimalną redundancją, poprzez zapisywanie danych w wielu małych tabelach, powiązanych ze sobą za pomocą kluczy podstawowych i obcych.

MySQL AUTO_INCREMENT z przykładami

Klucz podstawowy musi być unikatowy, ponieważ jednoznacznie identyfikuje wiersz w bazie danych. Jak jednak możemy zagwarantować, że klucz podstawowy zawsze będzie unikatowy?

Jednym z możliwych rozwiązań byłoby użycie formuły do ​​generowania klucza podstawowego, która sprawdza istnienie klucza w tabeli przed dodaniem danych. To może zadziałać, ale podejście jest złożone i niepewne. Dwie sesje wstawiające dane w tym samym momencie mogą nadal odczytać tę samą wartość maksymalną i kolidować ze sobą.

Aby uniknąć takiej złożoności i zapewnić, że klucz podstawowy będzie zawsze unikalny, możemy użyć MySQL Funkcja autoinkrementacji do generowania kluczy podstawowych. Autoinkrementacja jest używana z typem danych INT. Typ danych INT obsługuje zarówno wartości ze znakiem, jak i bez znaku. Typy danych bez znaku mogą zawierać tylko liczby dodatnie. Zaleca się zdefiniowanie ograniczenia unsigned dla klucza podstawowego autoinkrementacji.

Składnia automatycznego zwiększania

Mając już ustalone uzasadnienie, przyjrzyjmy się skryptowi użytemu do utworzenia tabeli kategorii filmów.

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`)
);

Zwróć uwagę na „AUTO_INCREMENT” w polu „category_id”. Powoduje to automatyczne generowanie identyfikatora kategorii za każdym razem, gdy do tabeli wstawiany jest nowy wiersz. Nie jest on podawany podczas wstawiania danych do tabeli. MySQL generuje to.

Uwaga: Słowo kluczowe UNSIGNED podwaja dodatni zakres kolumny, a szerokość wyświetlania zapisana kiedyś jako int(11) jest przestarzała MySQL Od wersji 8.0.17. Zwykły int jest obecną formą.

Domyślnie wartość początkowa parametru AUTO_INCREMENT wynosi 1 i będzie zwiększana o 1 dla każdego nowego rekordu.

Przyjrzyjmy się aktualnej zawartości tabeli kategorii.

SELECT * FROM `categories`;

Wykonanie powyższego skryptu w MySQL Workbench i myflixdb dają nam następujące wyniki.

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

Istnieje osiem wierszy, więc następny wygenerowany identyfikator powinien wynosić 9. Wstawmy teraz nową kategorię do tabeli kategorii, podając tylko nazwę.

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

Wykonanie powyższego skryptu na myflixdb w MySQL Workbench daje nam następujące wyniki pokazane poniżej.

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

Zwróć uwagę, że nie podaliśmy identyfikatora kategorii. MySQL wygenerowało ją automatycznie, ponieważ identyfikator kategorii jest zdefiniowany jako auto-inkrementacja.

Jeśli chcesz uzyskać ostatni identyfikator wkładki, który został wygenerowany przez MySQL, możesz w tym celu użyć funkcji LAST_INSERT_ID. Skrypt pokazany poniżej pobiera ostatni wygenerowany identyfikator.

SELECT LAST_INSERT_ID();

Wykonanie powyższego skryptu zwraca ostatnią wartość autoinkrementacji wygenerowaną przez zapytanie INSERT. Wyniki przedstawiono poniżej.

MySQL AUTO_INCREMENT

Wskazówka: Funkcja LAST_INSERT_ID() ma zakres ograniczony do Twojego własnego połączenia, więc wartość wygenerowana przez wstawienie kodu przez innego użytkownika nigdy nie zostanie zwrócona przez pomyłkę.

Jak ustawić lub zresetować wartość początkową AUTO_INCREMENT

Domyślna sekwencja zaczyna się od 1, ale nie zawsze jest to wymagane w projekcie. Numery faktur mogą wymagać kontynuacji ze starszego systemu, a tabela testowa często wymaga zresetowania. MySQL Ujawnia licznik bezpośrednio, więc oba przypadki są obsługiwane za pomocą jednej klauzuli. Wykonaj poniższe kroki, aby kontrolować liczbę początkową.

  1. Ustaw wartość w momencie utworzenia. Dodaj klauzulę AUTO_INCREMENT do instrukcji CREATE TABLE. Pierwszy wstawiony wiersz otrzyma wtedy tę liczbę zamiast 1.
  2. Zmień wartość w istniejącej tabeli. Zastosowanie ALTER TABLE z tą samą klauzulą. MySQL akceptuje nowy numer tylko jeśli jest on wyższy od największego obecnie zapisanego identyfikatora.
  3. Zresetuj opróżnioną tabelę. TRUNCATE TABLE usuwa wszystkie wiersze i zwraca licznik do 1 w jednej operacji, czego nie można zrobić za pomocą samej operacji DELETE.
  4. Potwierdź zmianę. Wstaw wiersz i odczytaj identyfikator za pomocą LAST_INSERT_ID() przed użyciem nowej sekwencji.
-- 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`;

Rozmiar kroku można również zmienić za pomocą zmiennej systemowej auto_increment_increment, ale dotyczy ona całego serwera, a nie jednej tabeli. Jest ona używana głównie w replikacji, gdzie dwa serwery nie mogą generować tego samego identyfikatora.

Dlaczego w sekwencji AUTO_INCREMENT pojawiają się przerwy?

Wcześniej czy później tabela pokazuje identyfikatory takie jak 1, 2, 5, 6. Nic nie jest zepsute. Licznik został zaprojektowany tak, aby zagwarantować unikalność, a nie nieprzerwany ciąg liczb, i nigdy nie zwraca tej samej wartości dwa razy.

Luki pojawiają się z następujących powodów.

  • Usunięte wiersze: gdy wiersz zostaje usunięty z tabeli, jego automatycznie zwiększony identyfikator nie jest ponownie używany. MySQL kontynuuje generowanie nowych numerów sekwencyjnie.
  • Wycofane transakcje: Numer jest przejmowany w momencie uruchomienia operacji wstawiania. Jeśli transakcja zostanie wycofana, wiersz zniknie, ale numer zostanie już wykorzystany.
  • Nieudane wkładki: polecenie odrzucone przez ograniczenie UNIQUE nadal może wykorzystać identyfikator, zanim zakończy się niepowodzeniem.
  • Wkładki zbiorcze: InnoDB może zarezerwować blok liczb do wstawienia wielu wierszy i odrzucić te, których nie używa.

Próba zamknięcia tych luk to błąd. Ponowna numeracja wierszy powoduje uszkodzenie każdego klucza obcego, który na nie wskazuje, a sama wartość nie ma znaczenia biznesowego. Jeśli raport wymaga listy ciągłej, należy wygenerować numer wiersza w zapytaniu zamiast przepisywać zapisane dane.

FAQ

Nie. MySQL zezwala na dokładnie jedną kolumnę AUTO_INCREMENT na tabelę, a kolumna ta musi być indeksowana. Deklarując ją jako klucz podstawowy spełnia wymagania indeksowe.

Operacje wstawiania kończą się niepowodzeniem z powodu błędu duplikatu klucza, ponieważ licznik nie może przekroczyć wartości maksymalnej dla danego typu danych. Typ TINYINT bez znaku zatrzymuje się na 255. Przed tym punktem należy zmienić typ kolumny na szerszy, taki jak BIGINT.

Tak, od MySQL Od wersji 8.0. InnoDB zapisuje licznik do dziennika powtórzeń, dzięki czemu jest on przywracany po restarcie. Wcześniejsze wersje przeliczały go i mogły ponownie wydawać liczby zwolnione przez usunięcia.

Częściowo. Asystenci schematów AI w narzędziach takich jak MySQL Workbench Zaproponuj liczbę całkowitą bez znaku wystarczająco szeroką dla opisywanego wolumenu. Szacunek jest wiarygodny tylko na podstawie podanej wartości wzrostu, więc zweryfikuj go.

Często tak. Asystenci zapytań AI wskazują na wycofane transakcje, nieudane INSERT Oświadczenia i usunięte wiersze to typowe przyczyny. Potraktuj wyjaśnienie jako punkt wyjścia i potwierdź je w logach serwera.

Podsumuj ten post następująco: