Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Bazy danych

Słowa kluczowe: AUTO_INCREMENT w MySQL INSERT INTO w SQL Klucz główny w SQL NULL w SQL Typ integer

W bazie MySQL 8 (silnik InnoDB) tabela pracownicy ma klucz główny id typu INTEGER z atrybutami NOT NULL i AUTO_INCREMENT oraz pola imie i nazwisko. Tabela zawierała rekordy o id 1, 2 i 3, po czym usunięto rekord o id 3. Następnie wykonano kwerendę

INSERT INTO pracownicy (imie, nazwisko) VALUES ('Anna', 'Nowak');
Jaką wartość id otrzyma nowy rekord?
A. 1, bo licznik zaczyna numerację od początku.
Źle. Rekord o id 1 nadal istnieje, więc taka wartość dałaby duplikat klucza. Licznik nie wraca do początku.
B. 3, bo licznik wraca do najmniejszej wolnej wartości.
Źle. Licznik nie szuka wolnych wartości, tylko nadaje kolejną po ostatnio nadanej. Luka po id 3 zostaje.
C. NULL, bo pole id pominięto w kwerendzie.
Źle. Pominięcie id w kwerendzie uruchamia licznik, a klucz główny i tak nie może mieć wartości NULL.
D. 4, bo licznik AUTO_INCREMENT nie cofa się po usunięciu rekordu.
Dobrze. Licznik po rekordach 1, 2 i 3 wskazuje 4 i nie cofa się po usunięciu rekordu.

Licznik AUTO_INCREMENT pamięta następną wartość do nadania i tylko rośnie. Po wstawieniu rekordów 1, 2 i 3 ustawił się na 4. Usunięcie rekordu o id 3 nie zmienia licznika, więc nowa Anna Nowak dostanie id 4. W tabeli powstaje luka w numeracji i jest to zachowanie zamierzone.

Dzięki temu identyfikator raz użyty nie trafia do innej osoby, co chroni przed pomyleniem danych, np. gdy w innym systemie została jeszcze stara wartość. Od MySQL 8 licznik InnoDB jest zapisywany trwale i nie cofa się nawet po restarcie serwera. Licznik można przestawić ręcznie: ALTER TABLE pracownicy AUTO_INCREMENT = 3;, ale nie ustawi się go poniżej największego istniejącego id plus jeden, a TRUNCATE TABLE zeruje go razem z danymi.

Najczęstsze założenie jest takie, że baza „uzupełni dziurę” i nada 3. Tak działałby człowiek numerujący kartki, ale nie licznik AUTO_INCREMENT. On nie szuka wolnych wartości, tylko nadaje kolejną po ostatnio nadanej. Luki po usuniętych rekordach są normalne i nie są błędem.

Wartość NULL w kluczu głównym jest niemożliwa, bo klucz główny wymaga wartości, a do tego kolumna ma NOT NULL. Pominięcie pola id w INSERT to wręcz sygnał dla bazy, żeby użyła licznika.

Numeracja od 1 groziłaby duplikatem klucza, bo rekord o id 1 nadal istnieje. Licznik wraca do początku tylko po TRUNCATE TABLE albo po ponownym utworzeniu tabeli.

Aktualny stan licznika pokazuje kolumna Auto_increment w wyniku polecenia SHOW TABLE STATUS LIKE 'pracownicy';. Po usunięciu rekordu nadal będzie tam 4, co potwierdza, że numeracja idzie dalej.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.