Jak utworzyć bazę i tabelę, ustawić klucz główny z AUTO_INCREMENT, dołożyć klucz obcy, zmienić strukturę przez ALTER TABLE i czym różni się DROP od DELETE i TRUNCATE. Lekcja 8.2 kursu INF.03.
Polecenia DDL budują POJEMNIK na dane: bazę, tabelę, kolumny i klucze. CREATE (UTWÓRZ) tworzy, ALTER (ZMIEŃ) przebudowuje istniejącą tabelę, DROP (PORZUĆ) usuwa razem ze strukturą. Na egzaminie pisemnym pytania dotyczą głównie różnicy między tymi trzema i zapisu klucza obcego. W części praktycznej ALTER TABLE ... ADD z dobrze dobranym typem danych to zwykle jedna z czterech ocenianych kwerend.
CREATE DATABASE i CREATE TABLE
Baza to zbiór tabel. Na egzaminie praktycznym tworzy się ją w phpMyAdmin albo poleceniem:
CREATE DATABASE egzamin
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_polish_ci;
USE egzamin;
CHARACTER SET to zestaw znaków, a COLLATE (PORÓWNANIE) zasady sortowania i porównywania tekstu. utf8mb4 obsługuje polskie znaki i emoji; bez niego „ą" potrafi się zamienić w znak zapytania. USE wybiera bazę, w której działają kolejne polecenia.
Tabela powstaje z listy kolumn. Każda kolumna to nazwa, typ i opcjonalne ograniczenia:
CREATE TABLE produkt (
id INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(80) NOT NULL,
cena DECIMAL(8,2) NOT NULL DEFAULT 0,
kategoria VARCHAR(30),
sztuk INT
);
PRIMARY KEY
klucz główny: wartość unikalna i nigdy pusta, jeden na tabelę
AUTO_INCREMENT
baza sama wstawia kolejny numer przy dodawaniu wiersza
NOT NULL
kolumna nie przyjmie pustej wartości
DEFAULT wartość
wartość wstawiana, gdy INSERT pomija tę kolumnę
UNIQUE
wartości nie mogą się powtarzać, ale NULL jest dozwolony
CHECK (warunek)
wiersz musi spełniać warunek (MySQL 8.0 i nowsze)
Pułapka: PRIMARY KEY i UNIQUE to nie to samo. Klucz główny jest jeden i nie przyjmuje NULL. Kolumn UNIQUE może być kilka i każda dopuszcza pustą wartość.
Klucz obcy, czyli relacja
Klucz obcy (FOREIGN KEY) to kolumna, która wskazuje na klucz główny innej tabeli. To on tworzy relację i pilnuje, żeby zamówienie nie wskazywało na nieistniejącego klienta.
CREATE TABLE zamowienie (
id INT AUTO_INCREMENT PRIMARY KEY,
klient_id INT,
produkt_id INT NOT NULL,
ilosc INT NOT NULL DEFAULT 1,
FOREIGN KEY (klient_id) REFERENCES klient(id),
FOREIGN KEY (produkt_id) REFERENCES produkt(id)
);
Trzy zasady, o które pytają arkusze:
1.
Typ klucza obcego musi być taki sam jak typ klucza głównego, na który wskazuje. INT do INT, nie INT do VARCHAR.
2.
Tabela nadrzędna musi istnieć wcześniej. Skrypt tworzy najpierw klient i produkt, dopiero potem zamowienie.
3.
Klucz obcy działa tylko w silniku InnoDB. Starszy MyISAM przyjmie zapis i po cichu go zignoruje. W MySQL od wersji 5.5 InnoDB jest domyślny, więc zwykle nie trzeba nic robić.
Można dopisać, co ma się stać po usunięciu wiersza nadrzędnego: ON DELETE CASCADE usunie także zamówienia klienta, ON DELETE SET NULL zostawi zamówienia z pustym klient_id. Bez tego zapisu baza po prostu nie pozwoli usunąć klienta, który ma zamówienia.
ALTER TABLE: zmiana istniejącej tabeli
ALTER TABLE zmienia strukturę tabeli, która już jest w bazie i ma dane. To polecenie z części praktycznej.
ALTER TABLE produkt ADD ocena TINYINT UNSIGNED; -- nowa kolumna
ALTER TABLE produkt MODIFY nazwa VARCHAR(120) NOT NULL; -- zmiana typu
ALTER TABLE produkt CHANGE sztuk stan INT; -- zmiana NAZWY i typu
ALTER TABLE produkt DROP COLUMN kategoria; -- usunięcie kolumny
ALTER TABLE produkt ADD UNIQUE (nazwa); -- nowe ograniczenie
ALTER TABLE zamowienie ADD FOREIGN KEY (klient_id) REFERENCES klient(id);
ALTER TABLE produkt RENAME TO towar; -- nowa nazwa tabeli
Słowo
Co robi
Czy trzeba podać nową nazwę
ADD
dokłada kolumnę albo ograniczenie
nie dotyczy
MODIFY
zmienia typ i ograniczenia kolumny
nie, nazwa zostaje
CHANGE
zmienia nazwę ORAZ definicję
tak, stara i nowa nazwa
DROP COLUMN
usuwa kolumnę razem z danymi
nie dotyczy
Pułapka: MODIFY i CHANGE mylą się w pytaniach. MODIFY nazwa VARCHAR(120) zmienia tylko typ. Zmiana nazwy kolumny wymaga CHANGE stara_nazwa nowa_nazwa TYP, czyli podania typu jeszcze raz.
Nowa kolumna trafia domyślnie na koniec tabeli. AFTER kolumna albo FIRST ustawia ją w konkretnym miejscu:
ALTER TABLE produkt ADD ocena TINYINT AFTER nazwa;
Trzy polecenia naraz: tabela, dwa wiersze, odczyt. Zwróć uwagę na kolumnę id:
DROP, DELETE, TRUNCATE
Trzy polecenia, które coś usuwają, i klasyczny zestaw odpowiedzi w pytaniu testowym.
Polecenie
Rodzina
Co znika
Co zostaje
DELETE FROM produkt WHERE id = 3;
DML
wskazane wiersze
tabela, struktura, reszta wierszy
DELETE FROM produkt;
DML
wszystkie wiersze
pusta tabela, licznik AUTO_INCREMENT bez zmian
TRUNCATE TABLE produkt;
DDL
wszystkie wiersze naraz
pusta tabela, licznik AUTO_INCREMENT od nowa
DROP TABLE produkt;
DDL
wiersze RAZEM z tabelą
nic, tabeli nie ma
DROP DATABASE egzamin;
DDL
cała baza
nic
TRUNCATE jest szybszy od DELETE bez warunku, bo nie usuwa wierszy pojedynczo, tylko tworzy tabelę od nowa. Za to nie da się go cofnąć i nie przyjmuje warunku WHERE.
Dopisek IF EXISTS chroni skrypt przed błędem, gdy obiektu nie ma: DROP TABLE IF EXISTS produkt;. Odwrotnie działa IF NOT EXISTS przy tworzeniu. W skryptach z arkuszy oba zapisy pojawiają się często.
Na egzaminie
Pytanie pisemne wygląda tak: „Za pomocą polecenia ALTER TABLE można" z odpowiedziami usuwać tabelę, tworzyć tabelę, modyfikować strukturę tabeli, modyfikować wartości w rekordach. Poprawna jest trzecia: ALTER zmienia STRUKTURĘ, a nie zawartość. Wartości zmienia UPDATE. Drugi typ pytania pokazuje definicję tabeli i pyta o skutek: co się stanie przy wstawieniu wiersza bez wartości, gdy kolumna ma NOT NULL i nie ma DEFAULT.
W części praktycznej arkusz opisuje kolumnę słowami: „dodaj kolumnę ocena o rozmiarze pozwalającym na wpisanie jedynie liczb z przedziału od 0 do 255". To ALTER TABLE produkt ADD ocena TINYINT UNSIGNED;. Zapisz polecenie w pliku z kwerendami dokładnie w tej postaci, w której je wykonałeś.
Ściąga
nowa baza
CREATE DATABASE nazwa DEFAULT CHARACTER SET utf8mb4;
nowa tabela
CREATE TABLE t (id INT AUTO_INCREMENT PRIMARY KEY, ...);
klucz obcy przy tworzeniu
FOREIGN KEY (klient_id) REFERENCES klient(id)
nowa kolumna
ALTER TABLE t ADD kolumna TYP;
zmiana typu
ALTER TABLE t MODIFY kolumna TYP;
zmiana nazwy kolumny
ALTER TABLE t CHANGE stara nowa TYP;
usunięcie kolumny
ALTER TABLE t DROP COLUMN kolumna;
usunięcie wierszy
DELETE FROM t WHERE ...; albo TRUNCATE TABLE t;
usunięcie tabeli
DROP TABLE IF EXISTS t;
Pobierz ściągę PDF