INSERT INTO pracownicy (imie, nazwisko) VALUES ('Anna', 'Nowak'); W tabeli pracownicy zdefiniowano klucz główny typu INTEGER z atrybutami NOT NULL...
INSERT INTO pracownicy (imie, nazwisko) VALUES ('Anna', 'Nowak');W tabeli pracownicy zdefiniowano klucz główny typu INTEGER z atrybutami NOT NULL oraz AUTO_INCREMENT. Ponadto zdefiniowano pola imie oraz nazwisko. W przypadku zastosowania przedstawionej w ramce kwerendy SQL wprowadzającej dane, w której zostało pominięte pole klucza, w bazie danych MySQL nastąpi
A. błąd nieprawidłowej liczby pól.
B. wpisanie rekordu do tabeli, dla klucza głównego zostanie przydzielona kolejna wartość naturalna.
C. zignorowanie polecenia, tabela pozostanie bez zmian.
D. wpisanie rekordu do tabeli, dla klucza głównego zostanie przydzielona wartość NULL.
Pytanie z egzaminu CKE, styczeń 2020 (arkusz E.14-SG-20.01).
W tej sytuacji MySQL wykona polecenie INSERT i dopisze nowy rekord do tabeli pracownicy. Ponieważ w zapytaniu podano jawnie tylko kolumny imie oraz nazwisko, baza danych oczekuje dokładnie dwóch wartości i właśnie tyle dostaje: Anna oraz Nowak. Pole klucza głównego zostało pominięte, ale ma atrybut AUTO_INCREMENT, więc MySQL sam nada mu następną dostępną wartość liczbową, na przykład 1, 2, 3 itd. To jest typowy i poprawny sposób dodawania rekordów do tabel, w których identyfikator jest generowany automatycznie. Moim zdaniem to jedna z ważniejszych praktycznych rzeczy w SQL, bo w aplikacjach webowych prawie nigdy nie wpisuje się ręcznie id użytkownika, produktu czy pracownika. Robi to silnik bazy danych, co zmniejsza ryzyko duplikatów i konfliktów klucza głównego. Dobra praktyka jest taka, żeby w INSERT podawać listę kolumn, tak jak tutaj: dzięki temu zapytanie jest czytelne i mniej podatne na błędy po późniejszej zmianie struktury tabeli.
W tym zapytaniu nie wystąpi błąd nieprawidłowej liczby pól, ponieważ składnia INSERT INTO pracownicy (imie, nazwisko) VALUES ('Anna', 'Nowak') jest spójna: wymieniono dwie kolumny i podano dwie wartości. Częsty błąd myślowy polega na założeniu, że skoro tabela ma jeszcze klucz główny, to każda instrukcja INSERT musi zawierać także tę kolumnę. Tak nie jest, jeżeli zapytanie jawnie wskazuje listę kolumn, do których wstawiane są dane. Silnik bazy danych uzupełnia pozostałe pola zgodnie z ich definicją, wartościami domyślnymi albo mechanizmami automatycznymi. Polecenie nie zostanie też po prostu zignorowane. MySQL nie działa w taki sposób, że pomija poprawne zapytanie tylko dlatego, że nie podano wszystkich kolumn tabeli. Jeśli nie ma naruszenia ograniczeń, rekord zostanie zapisany. Nie zostanie również przypisana wartość NULL do klucza głównego. Klucz główny ma NOT NULL, więc nie może przechowywać NULL, a dodatkowo AUTO_INCREMENT oznacza automatyczne generowanie kolejnych wartości całkowitych. W praktyce taka kolumna pełni rolę identyfikatora rekordu i baza pilnuje jej unikalności. Z mojego doświadczenia warto zapamiętać prostą zasadę: gdy kolumna AUTO_INCREMENT jest pominięta w INSERT, MySQL nadaje jej kolejną wartość samodzielnie, a programista skupia się na danych biznesowych, takich jak imię i nazwisko.