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_magazynu do produktów,
  • dodać pole status do zamówień (np. „nowe”, „wysłane”, „anulowane”),
  • wprowadzić wersjonowanie schematu.
  1. Przygotuj migrację v2 z tymi zmianami (ALTER TABLE).
  2. Napisz rollback v2 cofający zmiany.
  3. 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!

  1. Jak dodać nowe pole do istniejącej tabeli?
  2. Dlaczego przed poważną migracją warto wykonać backup?
  3. Po co wersjonować schemat bazy?
  4. Na czym polega rollback migracji?
  5. 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_versions z 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