CREATE, ALTER, DROP: budowanie tabel i kluczy

INF.03 · teoria
autor: redakcja · 07.09.2026 · aktualizacja: 08.09.2026
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.
Po­le­ce­nia DDL budują POJEMNIK na dane: bazę, tabelę, ko­lum­ny i klucze. CREATE (UTWÓRZ) tworzy, ALTER (ZMIEŃ) prze­bu­do­wu­je ist­nie­ją­cą tabelę, DROP (PORZUĆ) usuwa razem ze struk­tu­rą. Na eg­za­mi­nie pi­sem­nym py­ta­nia do­ty­czą głów­nie róż­ni­cy między tymi trzema i zapisu klucza obcego. W części prak­tycz­nej ALTER TABLE ... ADD z dobrze do­bra­nym typem danych to zwykle jedna z czte­rech oce­nia­nych kwe­rend.

CREATE DATABASE i CREATE TABLE

Baza to zbiór tabel. Na eg­za­mi­nie prak­tycz­nym tworzy się ją w phpMyAdmin albo po­le­ce­niem:
CREATE DATABASE egzamin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci; USE egzamin;
CHARACTER SET to zestaw znaków, a COLLATE (PORÓWNANIE) zasady sor­to­wa­nia i po­rów­ny­wa­nia tekstu. utf8mb4 ob­słu­gu­je pol­skie znaki i emoji; bez niego „ą" po­tra­fi się za­mie­nić w znak za­py­ta­nia. USE wy­bie­ra bazę, w której dzia­ła­ją ko­lej­ne po­le­ce­nia.
Tabela po­wsta­je z listy kolumn. Każda ko­lum­na to nazwa, typ i opcjo­nal­ne ogra­ni­cze­nia:
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 );
Ogra­ni­cze­nie
Co robi
PRIMARY KEY
klucz główny: war­tość uni­kal­na i nigdy pusta, jeden na tabelę
AUTO_INCREMENT
baza sama wsta­wia ko­lej­ny numer przy do­da­wa­niu wier­sza
NOT NULL
ko­lum­na nie przyj­mie pustej war­to­ści
DEFAULT wartość
war­tość wsta­wia­na, gdy INSERT pomija tę ko­lum­nę
UNIQUE
war­to­ści nie mogą się po­wta­rzać, ale NULL jest do­zwo­lo­ny
CHECK (warunek)
wiersz musi speł­niać wa­ru­nek (MySQL 8.0 i nowsze)
Pu­łap­ka: PRIMARY KEY i UNIQUE to nie to samo. Klucz główny jest jeden i nie przyj­mu­je NULL. Kolumn UNIQUE może być kilka i każda do­pusz­cza pustą war­tość.

Klucz obcy, czyli re­la­cja

Klucz obcy (FOREIGN KEY) to ko­lum­na, która wska­zu­je na klucz główny innej tabeli. To on tworzy re­la­cję i pil­nu­je, żeby za­mó­wie­nie nie wska­zy­wa­ło na nie­ist­nie­ją­ce­go klien­ta.
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ą ar­ku­sze:
  • 1.
    Typ klucza obcego musi być taki sam jak typ klucza głów­ne­go, na który wska­zu­je. INT do INT, nie INT do VARCHAR.
  • 2.
    Tabela nad­rzęd­na musi ist­nieć wcze­śniej. Skrypt tworzy naj­pierw klient i produkt, do­pie­ro potem zamowienie.
  • 3.
    Klucz obcy działa tylko w sil­ni­ku InnoDB. Star­szy MyISAM przyj­mie zapis i po cichu go zi­gno­ru­je. W MySQL od wersji 5.5 InnoDB jest do­myśl­ny, więc zwykle nie trzeba nic robić.
Można do­pi­sać, co ma się stać po usu­nię­ciu wier­sza nad­rzęd­ne­go: ON DELETE CASCADE usunie także za­mó­wie­nia klien­ta, ON DELETE SET NULL zo­sta­wi za­mó­wie­nia z pustym klient_id. Bez tego zapisu baza po prostu nie po­zwo­li usunąć klien­ta, który ma za­mó­wie­nia.

ALTER TABLE: zmiana ist­nie­ją­cej tabeli

ALTER TABLE zmie­nia struk­tu­rę tabeli, która już jest w bazie i ma dane. To po­le­ce­nie z części prak­tycz­nej.
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
do­kła­da ko­lum­nę albo ogra­ni­cze­nie
nie do­ty­czy
MODIFY
zmie­nia typ i ogra­ni­cze­nia ko­lum­ny
nie, nazwa zo­sta­je
CHANGE
zmie­nia nazwę ORAZ de­fi­ni­cję
tak, stara i nowa nazwa
DROP COLUMN
usuwa ko­lum­nę razem z danymi
nie do­ty­czy
Pu­łap­ka: MODIFY i CHANGE mylą się w py­ta­niach. MODIFY nazwa VARCHAR(120) zmie­nia tylko typ. Zmiana nazwy ko­lum­ny wymaga CHANGE stara_nazwa nowa_nazwa TYP, czyli po­da­nia typu jesz­cze raz.
Nowa ko­lum­na trafia do­myśl­nie na koniec tabeli. AFTER kolumna albo FIRST usta­wia ją w kon­kret­nym miej­scu:
ALTER TABLE produkt ADD ocena TINYINT AFTER nazwa;
Trzy po­le­ce­nia naraz: tabela, dwa wier­sze, odczyt. Zwróć uwagę na ko­lum­nę id:
[ SQL ]
baza: sklep
zapytanie
168/4000
Otwórz w placu zabaw ›

DROP, DELETE, TRUNCATE

Trzy po­le­ce­nia, które coś usu­wa­ją, i kla­sycz­ny zestaw od­po­wie­dzi w py­ta­niu te­sto­wym.
Po­le­ce­nie
Ro­dzi­na
Co znika
Co zo­sta­je
DELETE FROM produkt WHERE id = 3;
DML
wska­za­ne wier­sze
tabela, struk­tu­ra, reszta wier­szy
DELETE FROM produkt;
DML
wszyst­kie wier­sze
pusta tabela, licz­nik AUTO_INCREMENT bez zmian
TRUNCATE TABLE produkt;
DDL
wszyst­kie wier­sze naraz
pusta tabela, licz­nik AUTO_INCREMENT od nowa
DROP TABLE produkt;
DDL
wier­sze RAZEM z tabelą
nic, tabeli nie ma
DROP DATABASE egzamin;
DDL
cała baza
nic
TRUNCATE jest szyb­szy od DELETE bez wa­run­ku, bo nie usuwa wier­szy po­je­dyn­czo, tylko tworzy tabelę od nowa. Za to nie da się go cofnąć i nie przyj­mu­je wa­run­ku WHERE.
Do­pi­sek IF EXISTS chroni skrypt przed błędem, gdy obiek­tu nie ma: DROP TABLE IF EXISTS produkt;. Od­wrot­nie działa IF NOT EXISTS przy two­rze­niu. W skryp­tach z ar­ku­szy oba zapisy po­ja­wia­ją się często.

Na eg­za­mi­nie

Py­ta­nie pi­sem­ne wy­glą­da tak: „Za pomocą po­le­ce­nia ALTER TABLE można" z od­po­wie­dzia­mi usuwać tabelę, two­rzyć tabelę, mo­dy­fi­ko­wać struk­tu­rę tabeli, mo­dy­fi­ko­wać war­to­ści w re­kor­dach. Po­praw­na jest trze­cia: ALTER zmie­nia STRUKTURĘ, a nie za­war­tość. War­to­ści zmie­nia UPDATE. Drugi typ py­ta­nia po­ka­zu­je de­fi­ni­cję tabeli i pyta o skutek: co się stanie przy wsta­wie­niu wier­sza bez war­to­ści, gdy ko­lum­na ma NOT NULL i nie ma DEFAULT.
W części prak­tycz­nej arkusz opi­su­je ko­lum­nę sło­wa­mi: „dodaj ko­lum­nę ocena o roz­mia­rze po­zwa­la­ją­cym na wpi­sa­nie je­dy­nie liczb z prze­dzia­łu od 0 do 255". To ALTER TABLE produkt ADD ocena TINYINT UNSIGNED;. Zapisz po­le­ce­nie w pliku z kwe­ren­da­mi do­kład­nie w tej po­sta­ci, w której je wy­ko­na­łeś.

Ściąga

Za­da­nie
Po­le­ce­nie
nowa baza
CREATE DATABASE nazwa DEFAULT CHARACTER SET utf8mb4;
wybór bazy
USE nazwa;
nowa tabela
CREATE TABLE t (id INT AUTO_INCREMENT PRIMARY KEY, ...);
klucz obcy przy two­rze­niu
FOREIGN KEY (klient_id) REFERENCES klient(id)
nowa ko­lum­na
ALTER TABLE t ADD kolumna TYP;
zmiana typu
ALTER TABLE t MODIFY kolumna TYP;
zmiana nazwy ko­lum­ny
ALTER TABLE t CHANGE stara nowa TYP;
usu­nię­cie ko­lum­ny
ALTER TABLE t DROP COLUMN kolumna;
usu­nię­cie wier­szy
DELETE FROM t WHERE ...; albo TRUNCATE TABLE t;
usu­nię­cie tabeli
DROP TABLE IF EXISTS t;
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.