DB
Modyfikowanie struktury bazy oraz danych (ALTER TABLE)
ALTER, migracje i wersjonowanie schematu · INF.03.4
Teoria ALTER TABLE, migracje i kontrola wersji bazy
- ALTER TABLE służy do modyfikowania struktury istniejącej tabeli: dodawania/usuwania kolumn, zmiany typów danych, kluczy, indeksów i constraintów.
- Migracja schematu to uporządkowany zestaw poleceń (np. w pliku .sql), który zmienia bazę z wersji „v1” na „v2”.
- Wersjonowanie schematu polega na nadawaniu numerów kolejnym migracjom oraz zapisywaniu, kiedy i w jakiej kolejności zostały wykonane.
- Zmiany w bazie powinny być planowane: analiza wpływu na dane, testy na kopii, backup, dopiero potem ALTER na bazie docelowej.
- Dobrym nawykiem jest przygotowanie także skryptu „rollback”, który odwraca wprowadzone zmiany, jeśli coś pójdzie nie tak.
Myślenie o bazie w kategoriach wersji (v1, v2, v3…) porządkuje pracę – zarówno na egzaminie INF.03.4, jak i w prawdziwych projektach.
Ćwiczenie 1 ALTER TABLE — dodanie nowego pola
Zadanie: Dodaj pole
data_urodzenia do tabeli uczniowie.
- Dobierz odpowiedni typ (data, nie tekst).
- Nie uszkodź istniejących danych.
ALTER TABLE uczniowie ADD COLUMN data_urodzenia DATE;
Ćwiczenie 2 Zmiana typu i constraintów
Zadanie: Zmień typ pola
email w tabeli uczniowie na VARCHAR(120) i dodaj NOT NULL oraz UNIQUE.
- Upewnij się, że istniejące rekordy mają uzupełnione adresy email (inaczej NOT NULL się nie powiedzie).
- Na końcu dodaj constraint UNIQUE, aby maile się nie powtarzały.
-- Krok 0 (opcjonalnie): uzupełnij brakujące maile
-- UPDATE uczniowie SET email = CONCAT('brak', id, '@example.com') WHERE email IS NULL;
ALTER TABLE uczniowie
MODIFY COLUMN email VARCHAR(120) NOT NULL;
ALTER TABLE uczniowie
ADD UNIQUE (email);
Ćwiczenie 3 Usuwanie kolumny — konsekwencje
Zadanie: Usuń pole
login z tabeli nauczyciele.
- Zastanów się, czy dane z tej kolumny są jeszcze potrzebne (np. wyeksportuj je do pliku).
- Sprawdź, czy aplikacja nie odwołuje się do tej kolumny.
ALTER TABLE nauczyciele DROP COLUMN login;
Ćwiczenie 4 Skrypt migracyjny — przejście z v1 do v2
Sytuacja: Masz bazę w wersji v1, w której tabela
uczniowie nie ma kolumny email.
Zadanie: Przygotuj migrację v2 dodającą email oraz rollback, który wraca do v1.
- Migracja v2: dodaj kolumnę, ustaw NOT NULL i UNIQUE.
- Rollback v2: usuń kolumnę i ew. wpis z tabeli wersji.
-- migracja_v2.sql (przejście v1 -> v2) ALTER TABLE uczniowie ADD COLUMN email VARCHAR(120); -- Na tym etapie możesz uzupełnić istniejące maile ALTER TABLE uczniowie MODIFY COLUMN email VARCHAR(120) NOT NULL; ALTER TABLE uczniowie ADD UNIQUE (email); -- rollback_v2.sql (powrót v2 -> v1) ALTER TABLE uczniowie DROP COLUMN email;
Ćwiczenie 5 Wersjonowanie schematu w tabeli
Zadanie: Utwórz tabelę do śledzenia wersji schematu oraz zapisz w niej, że zastosowano migrację v2.
- Tabela powinna przechowywać numer wersji, opis i datę zastosowania.
- Po wykonaniu migracji dodaj do niej odpowiedni rekord.
CREATE TABLE IF NOT EXISTS schema_versions (
id INT PRIMARY KEY AUTO_INCREMENT,
version VARCHAR(20) NOT NULL,
opis VARCHAR(255),
applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO schema_versions (version, opis)
VALUES ('v2', 'Dodanie kolumny email do uczniowie');
Zadanie INF.03.4 „Sklep internetowy” – zmiany w trakcie życia projektu
Opis: Masz bazę
sklep z tabelą produkty(id, nazwa, cena) i zamowienia(id, klient, data_zamowienia).
Projekt się rozwija – trzeba:
- dodać pole
stan_magazynudo produktów, - dodać pole
statusdo zamówień (np. „nowe”, „wysłane”, „anulowane”), - wprowadzić wersjonowanie schematu.
- Przygotuj migrację v2 z tymi zmianami (ALTER TABLE).
- Napisz rollback v2 cofający zmiany.
- Dodaj wpis do tabeli
schema_versions.
-- migracja_v2_sklep.sql
USE sklep;
ALTER TABLE produkty
ADD stan_magazynu INT DEFAULT 0;
ALTER TABLE zamowienia
ADD status ENUM('nowe', 'wyslane', 'anulowane') DEFAULT 'nowe';
CREATE TABLE IF NOT EXISTS schema_versions (
id INT PRIMARY KEY AUTO_INCREMENT,
version VARCHAR(20) NOT NULL,
opis VARCHAR(255),
applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO schema_versions (version, opis)
VALUES ('v2', 'Dodanie stanu magazynu i statusu zamowien');
-- rollback_v2_sklep.sql
USE sklep;
ALTER TABLE produkty
DROP COLUMN stan_magazynu;
ALTER TABLE zamowienia
DROP COLUMN status;
DELETE FROM schema_versions
WHERE version = 'v2';
Quiz Sprawdź wiedzę o ALTER i migracjach!
- Jak dodać nowe pole do istniejącej tabeli?
- Dlaczego przed poważną migracją warto wykonać backup?
- Po co wersjonować schemat bazy?
- Na czym polega rollback migracji?
- Jak odnotować zastosowanie migracji w bazie?
- Za pomocą polecenia
ALTER TABLE nazwa_tabeli ADD COLUMN nazwa typ;. - Aby w razie błędu móc szybko przywrócić poprzedni stan bazy i nie utracić danych.
- Aby śledzić zmiany, móc odtworzyć schemat w innej bazie oraz łatwo ustalić, co zostało zmienione.
- Rollback wykonuje odwrotne operacje niż migracja (np. DROP zamiast ADD), cofając bazę do wcześniejszej wersji.
- Można dodać wpis do tabeli
schema_versionsz numerem wersji, opisem i datą zastosowania.
Checklista Sprawdź umiejętności
- Modyfikuję tabele poleceniem ALTER TABLE (ADD/MODIFY/DROP).
- Planuję migracje, oceniając wpływ zmian na istniejące dane.
- Wersjonuję zmiany struktury w osobnych skryptach (v1, v2, v3…).
- Potrafię przygotować rollback i odnotować migrację w tabeli wersji.
Materiały: INF.03 — ALTER, migracje, wersjonowanie · Autor: Tomasz Puchała © 2025