-- 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).
-- 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;
| Polecenie | Co 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;
SET FOREIGN_KEY_CHECKS = 0;DROP TABLE tabela1, tabela2;SET FOREIGN_KEY_CHECKS = 1;
Napisz polecenie SQL dodające kolumnę rabat (DECIMAL 5,2, wartość domyślna 0.00) do tabeli produkty, po kolumnie cena:
Chcesz wyczyścić wszystkie dane z tabeli logi, ale zachować jej strukturę (kolumny, indeksy). Które polecenie zastosować?
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
ADD COLUMN / MODIFY COLUMN / CHANGE COLUMN / DROP COLUMN — modyfikacje kolumnAFTER kolumna / FIRST — pozycja nowej kolumnyDROP TABLE — usuwa całą tabelę | TRUNCATE — czyści dane, zachowuje strukturę