INSERT, UPDATE, DELETE: zmiana danych w tabeli

INF.03 · teoria
autor: redakcja · 07.09.2026 · aktualizacja: 08.09.2026
Jak dodać wiersz, jak zmienić wartości w istniejących rekordach i jak usunąć dane, żeby nie skasować całej tabeli. Składnia, kolejność kolumn, klucze obce i pułapka braku WHERE. Lekcja 8.3 kursu INF.03.
Trzy po­le­ce­nia DML zmie­nia­ją za­war­tość tabeli: INSERT (WSTAW) dodaje wier­sze, UPDATE (ZAKTUALIZUJ) zmie­nia war­to­ści w wier­szach, które już są, a DELETE (USUŃ) je kasuje. Na eg­za­mi­nie pi­sem­nym py­ta­nia po­ka­zu­ją tabelę przed zmianą i pytają, jak będzie wy­glą­dać po. W części prak­tycz­nej czwar­ta kwe­ren­da to naj­czę­ściej UPDATE, na przy­kład pod­nie­sie­nie ceny o dzie­sięć pro­cent.

Tabela, na której pra­cu­je­my

id
nazwa
cena
ka­te­go­ria
sztuk
1
Kla­wia­tu­ra
120
ak­ce­so­ria
15
2
Mysz
45
ak­ce­so­ria
0
3
Mo­ni­tor 24
650
mo­ni­to­ry
4
4
Mo­ni­tor 27
990
mo­ni­to­ry
2
5
Kabel HDMI
25
ak­ce­so­ria
NULL
Ko­lum­na id ma AUTO_INCREMENT, nazwa i cena mają NOT NULL, a cena do­dat­ko­wo DEFAULT 0.

INSERT: do­da­wa­nie wier­szy

Pełna postać wy­mie­nia ko­lum­ny, do któ­rych wsta­wiasz war­to­ści:
INSERT INTO produkt (nazwa, cena, kategoria, sztuk) VALUES ('Podkładka', 15, 'akcesoria', 40);
Ko­lej­ność war­to­ści musi od­po­wia­dać ko­lej­no­ści kolumn z na­wia­su. Ko­lum­ny id nie po­da­je­my, bo AUTO_INCREMENT sam wstawi ko­lej­ny numer. Ko­lum­na po­mi­nię­ta na liście do­sta­je war­tość DEFAULT, a gdy jej nie ma, NULL.
Krót­sza postać, bez listy kolumn, wymaga po­da­nia war­to­ści dla WSZYSTKICH kolumn tabeli, w ko­lej­no­ści z de­fi­ni­cji:
INSERT INTO produkt VALUES (NULL, 'Podkładka', 15, 'akcesoria', 40);
NULL w miej­scu id mówi bazie „wstaw ko­lej­ny numer sam". Ta postać jest krót­sza, ale psuje się przy każdej zmia­nie struk­tu­ry tabeli, więc w za­da­niach pisz wersję z listą kolumn.
Kilka wier­szy naraz za­pi­su­je się jednym po­le­ce­niem, prze­cin­ka­mi:
INSERT INTO produkt (nazwa, cena, kategoria) VALUES ('Podkładka', 15, 'akcesoria'), ('Monitor 32', 1490, 'monitory'), ('Hub USB', 60, 'akcesoria');
Pu­łap­ka: liczba war­to­ści musi się zga­dzać z liczbą kolumn. Ko­mu­ni­kat Column count doesn't match value count (liczba kolumn nie zgadza się z liczbą war­to­ści) znaczy do­kład­nie to i jest czę­stym py­ta­niem o roz­po­zna­nie błędu.

UPDATE: zmiana ist­nie­ją­cych war­to­ści

UPDATE produkt SET cena = 135 WHERE id = 1;
SET (USTAW) wy­mie­nia ko­lum­ny i nowe war­to­ści, WHERE wska­zu­je wier­sze do zmiany. Można zmie­niać kilka kolumn naraz, po prze­cin­ku:
UPDATE produkt SET cena = 135, kategoria = 'peryferia' WHERE nazwa = 'Klawiatura';
Nowa war­tość może być wy­li­czo­na ze starej. Pod­wyż­ka o dzie­sięć pro­cent dla mo­ni­to­rów:
UPDATE produkt SET cena = cena * 1.1 WHERE kategoria = 'monitory';
Prawa strona cena * 1.1 bierze cenę Z TEGO wier­sza, więc każdy mo­ni­tor do­sta­je swoją nową cenę. Ob­niż­ka o 20 zło­tych to SET cena = cena - 20.
Pu­łap­ka: UPDATE bez WHERE zmie­nia WSZYSTKIE wier­sze tabeli. To naj­częst­szy błąd na eg­za­mi­nie prak­tycz­nym i naj­częst­sza od­po­wiedź w py­ta­niu „jaki będzie skutek wy­ko­na­nia po­le­ce­nia".
Dobry nawyk: napisz naj­pierw SELECT * FROM produkt WHERE ... z tym samym wa­run­kiem. Jeżeli wynik po­ka­zu­je do­kład­nie te wier­sze, o które chodzi, zamień SELECT * na UPDATE ... SET.
Po wy­ko­na­niu po­rów­naj ceny mo­ni­to­rów z tabelą po­wy­żej. Przy­cisk przywróć bazę cofa zmianę:
[ SQL ]
baza: sklep
zapytanie
99/4000
Otwórz w placu zabaw ›

DELETE: usu­wa­nie wier­szy

DELETE FROM produkt WHERE id = 5; DELETE FROM produkt WHERE sztuk = 0;
Nie wy­mie­nia się kolumn, bo DELETE usuwa CAŁY wiersz. Nie da się nim usunąć jednej war­to­ści; do tego służy UPDATE ... SET kolumna = NULL.
Po­le­ce­nie
Skutek
DELETE FROM produkt WHERE id = 5;
znika jeden wiersz
DELETE FROM produkt;
zni­ka­ją wszyst­kie wier­sze, tabela zo­sta­je
TRUNCATE TABLE produkt;
to samo, szyb­ciej, licz­nik AUTO_INCREMENT rusza od 1
DROP TABLE produkt;
znika też sama tabela

Kiedy baza odmówi

Zmiana danych bywa od­rzu­ca­na i ko­mu­ni­kat wska­zu­je przy­czy­nę. Cztery sy­tu­acje z ar­ku­szy:
Sy­tu­acja
Ko­mu­ni­kat (skrót)
Dla­cze­go
brak war­to­ści dla NOT NULL
Field 'nazwa' doesn't have a default value
ko­lum­na wy­ma­ga­na, a INSERT ją po­mi­nął
po­wtó­rzo­ny klucz główny albo UNIQUE
Duplicate entry '1' for key 'PRIMARY'
taka war­tość już jest w tabeli
klucz obcy wska­zu­je na nie­ist­nie­ją­cy wiersz
Cannot add or update a child row
wsta­wiasz za­mó­wie­nie klien­ta, któ­re­go nie ma
usu­wasz wiersz, do któ­re­go ktoś się od­wo­łu­je
Cannot delete or update a parent row
klient ma za­mó­wie­nia, a klucz obcy tego pil­nu­je
Dwa ostat­nie przy­pad­ki to dzia­ła­nie klucza obcego, czyli więzy in­te­gral­no­ści. Baza nie po­zwa­la zo­sta­wić za­mó­wie­nia bez klien­ta i to jest jej zaleta, a nie błąd.

Ko­lej­ność przy wsta­wia­niu do kilku tabel

Skrypt z ar­ku­sza wsta­wia dane w ko­lej­no­ści za­leż­no­ści: naj­pierw tabele nad­rzęd­ne, potem te z klu­cza­mi obcymi. Dla naszej bazy: klient i produkt, na końcu zamowienie. Od­wrot­na ko­lej­ność kończy się ko­mu­ni­ka­tem Cannot add or update a child row.
Przy usu­wa­niu ko­lej­ność jest od­wrot­na: naj­pierw zamowienie, potem klient.

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne z tej lekcji: roz­po­zna­nie skutku UPDATE bez WHERE, wska­za­nie po­le­ce­nia, które doda wiersz („INSERT INTO czy UPDATE"), po­li­cze­nie wier­szy po DELETE z wa­run­kiem oraz roz­po­zna­nie ko­mu­ni­ka­tu o błę­dzie. Po­ja­wia się też py­ta­nie o to, co zrobi DELETE bez WHERE w po­rów­na­niu z DROP.
W części prak­tycz­nej czwar­ta kwe­ren­da to zwykle UPDATE opi­sa­ny sło­wa­mi, na przy­kład „pod­nieś cenę wszyst­kich wy­cie­czek o 10%". Zapisz po­le­ce­nie w pliku z kwe­ren­da­mi, wy­ko­naj je w phpMyAdmin i zrób zrzut ekranu. Po wy­ko­na­niu UPDATE phpMyAdmin po­ka­zu­je liczbę zmie­nio­nych wier­szy, więc od razu widać, czy wa­ru­nek był dobry.

Ściąga

Za­da­nie
Po­le­ce­nie
do­da­nie wier­sza
INSERT INTO t (kol1, kol2) VALUES ('a', 1);
kilka wier­szy naraz
INSERT INTO t (kol) VALUES ('a'), ('b'), ('c');
numer nada­wa­ny sam
pomiń ko­lum­nę id albo wstaw NULL
zmiana war­to­ści
UPDATE t SET kol = 'nowa' WHERE id = 1;
zmiana wy­li­czo­na ze starej
UPDATE t SET cena = cena * 1.1 WHERE ...;
usu­nię­cie wier­szy
DELETE FROM t WHERE warunek;
bez­piecz­nik
naj­pierw SELECT z tym samym WHERE
ko­lej­ność wsta­wia­nia
tabele nad­rzęd­ne przed ta­be­la­mi z klu­czem obcym
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ą.