🎯 Cele lekcji

🔧

1. ALTER TABLE — podstawowe operacje na kolumnach

-- Dodaj nową kolumnę (na końcu tabeli)
ALTER TABLE produkty
  ADD COLUMN waga DECIMAL(8,3) COMMENT 'Waga w kg';

-- Dodaj kolumnę na określonej pozycji
ALTER TABLE produkty
  ADD COLUMN waga DECIMAL(8,3) AFTER ilosc_mag;

-- Dodaj kolumnę jako PIERWSZĄ
ALTER TABLE produkty
  ADD COLUMN priorytet TINYINT DEFAULT 0 FIRST;

-- Modyfikuj istniejącą kolumnę (typ, atrybuty)
ALTER TABLE produkty
  MODIFY COLUMN nazwa VARCHAR(300) NOT NULL;

-- Zmień nazwę kolumny i opcjonalnie jej definicję
ALTER TABLE produkty
  CHANGE COLUMN kod_ean kod_barcode CHAR(13) UNIQUE;
-- CHANGE wymaga podania całej nowej definicji kolumny

-- Usuń kolumnę
ALTER TABLE produkty
  DROP COLUMN waga;
ALTER TABLE na dużych tabelach (miliony wierszy) może zablokować tabelę na długi czas. Na produkcji używaj narzędzi jak pt-online-schema-change (Percona Toolkit).
📑

2. ALTER TABLE — indeksy, FK i zmiana nazwy

-- Dodaj indeks zwykły
ALTER TABLE produkty
  ADD INDEX idx_nazwa (nazwa);

-- Dodaj indeks unikalny
ALTER TABLE klienci
  ADD UNIQUE INDEX uq_email (email);

-- Usuń indeks
ALTER TABLE produkty
  DROP INDEX idx_nazwa;

-- Dodaj klucz obcy po stworzeniu tabeli
ALTER TABLE produkty
  ADD CONSTRAINT fk_kat
    FOREIGN KEY (id_kategorii) REFERENCES kategorie(id_kategorii)
    ON DELETE SET NULL
    ON UPDATE CASCADE;

-- Usuń klucz obcy (musi być nazwa CONSTRAINT)
ALTER TABLE produkty
  DROP FOREIGN KEY fk_kat;

-- Zmień nazwę tabeli
RENAME TABLE produkty TO towary;
-- Lub:
ALTER TABLE produkty RENAME TO towary;

-- Zmień silnik składowania
ALTER TABLE stara_tabela ENGINE=InnoDB;

-- Kilka operacji naraz (wydajniejsze!)
ALTER TABLE produkty
  ADD COLUMN rabat DECIMAL(5,2) DEFAULT 0,
  ADD COLUMN producent VARCHAR(100),
  MODIFY COLUMN cena DECIMAL(12,2) NOT NULL;
🗑️

3. DROP TABLE, TRUNCATE TABLE — różnice

PolecenieCo usuwa?Przywracalny?Auto_Increment?FK?
DROP TABLE Całą tabelę (strukturę + dane + indeksy) Nie (DDL, autocommit) Resetuje Zablokowane jeśli są FK
TRUNCATE TABLE Wszystkie dane, zachowuje strukturę Nie (DDL, autocommit) Resetuje do 1 Zablokowane jeśli są FK
DELETE FROM Dane (można z WHERE) Tak (DML, można ROLLBACK) Nie resetuje Działa z FK (sprawdza CASCADE)
-- Usuń tabelę (bezpiecznie — bez błędu gdy nie istnieje)
DROP TABLE IF EXISTS produkty;

-- Usuń wiele tabel naraz
DROP TABLE IF EXISTS pozycje_zamowien, zamowienia, produkty, kategorie;

-- Wyczyść dane tabeli (szybciej niż DELETE FROM)
TRUNCATE TABLE logi_sesji;
Kolejność usuwania tabel z FK: Najpierw usuń tabele podrzędne (z FK), potem nadrzędne (z PK). Inaczej MySQL zwróci błąd integralności referencyjnej.

Lub tymczasowo wyłącz sprawdzanie FK:
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE tabela1, tabela2;
SET FOREIGN_KEY_CHECKS = 1;
✏️

Zadania interaktywne

Zadanie 1Napisz ALTER TABLE dodające kolumnę rabat

Napisz polecenie SQL dodające kolumnę rabat (DECIMAL 5,2, wartość domyślna 0.00) do tabeli produkty, po kolumnie cena:

Zadanie 2Quiz: DROP TABLE vs TRUNCATE TABLE

Chcesz wyczyścić wszystkie dane z tabeli logi, ale zachować jej strukturę (kolumny, indeksy). Które polecenie zastosować?

  • DROP TABLE logi; — usuwa tabelę całkowicie
  • TRUNCATE TABLE logi; — usuwa dane, zachowuje strukturę
  • ALTER TABLE logi DROP ALL; — usuwa wszystkie wiersze
  • REMOVE FROM logi; — poprawne polecenie SQL
Zadanie 3Popraw błędną sekwencję operacji

Poniższa sekwencja poleceń zawiera błąd. Wskaż co jest nie tak:

-- Próba usunięcia tabel z FK
DROP TABLE kategorie;      -- BŁĄD!
DROP TABLE produkty;       -- produkty.id_kategorii FK → kategorie
  • Błąd: powinna być użyta TRUNCATE zamiast DROP
  • Błąd: kolejność jest odwrócona — należy najpierw usunąć tabelę podrzędną (produkty), potem nadrzędną (kategorie)
  • Błąd: brakuje IF EXISTS po DROP TABLE
  • Brak błędu — kolejność nie ma znaczenia

📌 Zapamiętaj