SQL od podstaw · część 08

ALTER i DROP: zmiana struktury

Dodawaj kolumny świadomie. Rozpoznaj, kiedy zmieniasz definicję tabeli, a kiedy bezpowrotnie usuwasz jej dane.

Część bazodanowa INF.03

Struktura także się zmienia

Sklep zaczyna zbierać telefon kontaktowy. Nie trzeba tworzyć nowej bazy od początku: ALTER TABLE zmienia definicję istniejącej tabeli. Zmiana typu, usunięcie kolumny i dodanie ograniczenia wpływają również na dane oraz aplikacje korzystające z tabeli. Najpierw sprawdź zależności i przygotuj kopię możliwą do odtworzenia.

Dodaj kolumnę: ten sam cel, cztery dialekty

Telefon przechowujemy jako tekst. Przykłady poniżej dotyczą rzeczywistych silników, tabeli klienci bez istniejącej kolumny telefon. Wykonaj tylko wariant właściwy dla swojego środowiska.

-- MySQL / MariaDB
ALTER TABLE klienci ADD COLUMN telefon VARCHAR(25) NULL;

-- SQL Server
ALTER TABLE klienci ADD telefon NVARCHAR(25) NULL;

-- Oracle 19c
ALTER TABLE klienci ADD (telefon VARCHAR2(25 CHAR));

-- Access / ACE
ALTER TABLE klienci ADD COLUMN telefon TEXT(25);

Dodanie opcjonalnej kolumny pozwala uzupełniać dane stopniowo. Gdy w tabeli są stare wiersze, nie dodawaj od razu obowiązkowej kolumny bez decyzji, skąd wziąć brakujące wartości. Typowy proces: dodaj kolumnę dopuszczającą NULL, uzupełnij ją, sprawdź kompletność, a dopiero wtedy wprowadź NOT NULL.

Zmień typ albo długość

-- MySQL / MariaDB: pełna definicja kolumny
ALTER TABLE klienci MODIFY COLUMN telefon VARCHAR(40) NULL;

-- SQL Server
ALTER TABLE klienci ALTER COLUMN telefon NVARCHAR(40) NULL;

-- Oracle 19c
ALTER TABLE klienci MODIFY (telefon VARCHAR2(40 CHAR));

-- Access / ACE
ALTER TABLE klienci ALTER COLUMN telefon TEXT(40);

Poszerzenie pola tekstowego jest inną operacją niż skrócenie limitu do 5 znaków. Skrócenie może zakończyć się błędem lub utratą części danych zależnie od silnika, trybu i operacji. Zmiana tekstu na liczbę wymaga sprawdzenia wszystkich wartości. Nie zakładaj, że silnik poprawnie odgadnie znaczenie numeru telefonu.

W MySQL/MariaDB przy MODIFY podaj potrzebne atrybuty definicji, np. NOT NULL i DEFAULT — pominięte atrybuty mogą nie zostać zachowane. Nazwy ograniczeń zapisuj w projekcie: łatwiej świadomie zmienić ck_towary_cena niż wyszukiwać przypadkową nazwę wygenerowaną przez serwer.

Usunięcie kolumny i tabeli

-- Odpowiedni rzeczywisty silnik, wyłącznie dane ćwiczeniowe
ALTER TABLE klienci DROP COLUMN telefon;

-- Wspólny podstawowy zapis
DROP TABLE tabela_probna;

DROP COLUMN usuwa kolumnę wraz z jej wartościami. DROP TABLE usuwa definicję tabeli i jej dane. To inna operacja niż DELETE, które usuwa wiersze, pozostawiając strukturę. DROP DATABASE usuwa całą bazę i nie jest potrzebne do tej lekcji. Nie używaj poleceń DROP do „naprawiania” nieznanego błędu.

Klucze obce, indeksy, widoki i kod aplikacji mogą zależeć od usuwanego obiektu. Odmowa usunięcia tabeli nadrzędnej jest informacją o zależności, nie powodem do bezrefleksyjnego wyłączania kontroli kluczy. Najpierw zdecyduj, co ma się stać z danymi powiązanymi.

Nie licz na uniwersalne Cofnij. MySQL/MariaDB i Oracle mają polecenia DDL powodujące niejawne zatwierdzanie. SQL Server pozwala objąć wiele zmian DDL transakcją, ale zależy to od konkretnej operacji. Zachowanie edytora, który cofa nieudany pakiet, nie opisuje transakcji rzeczywistego serwera.

Ćwiczenie zmiany schematu w przeglądarce

Edytor obsługuje tylko prosty wariant ALTER TABLE ADD z typem INTEGER/INT, TEXT albo REAL. Poniższy pakiet dodaje opcjonalny telefon do danych startowych. Odczyt pokaże pięć wierszy i NULL w nowej kolumnie. Powtórne dodanie tej samej kolumny ma zgłosić błąd; Reset bazy przywraca początek.

ALTER TABLE klienci ADD telefon TEXT;
SELECT id, imie, telefon FROM klienci ORDER BY id;

Wypróbuj zapytanie

SQLite w przeglądarce — ograniczona emulacja składni MySQL / SQL Server. To nie są rzeczywiste serwery. Ścisłe typy, auto-ID i administrację ćwicz w prawdziwym SZBD.

Ładowanie edytora…

Ćwiczenia i rozwiązania

  1. Dodaj do produktów kolumnę uwagi typu TEXT w edytorze. Wyświetl nazwy i uwagi.
  2. Przygotuj dla MySQL/MariaDB zmianę limitu uwag na VARCHAR(300), dopuszczający NULL. Wyjaśnij, dlaczego nie wykonasz jej w edytorze.
  3. Masz tabelę z 1000 wierszy i chcesz dodać wymagany numer klienta. Opisz kolejność bez zgadywania numerów.
Rozwiązania
-- W edytorze
ALTER TABLE produkty ADD uwagi TEXT;
SELECT nazwa, uwagi FROM produkty ORDER BY id;

-- Tylko właściwy serwer MySQL/MariaDB
ALTER TABLE produkty MODIFY COLUMN uwagi VARCHAR(300) NULL;

1. Cztery produkty, uwagi NULL. 2. Edytor nie emuluje zmiany typu ani limitu VARCHAR. Najpierw trzeba sprawdzić długości istniejących treści. 3. Dodaj kolumnę opcjonalną, pozyskaj poprawne wartości z wiarygodnego źródła, sprawdź braki i duplikaty, dopiero potem dodaj NOT NULL/UNIQUE zgodnie z wymaganiami. Nie zastępuj wszystkich braków tym samym fikcyjnym numerem.

Dokumentacja: MySQL ALTER TABLE, SQL Server ALTER TABLE, Oracle ALTER TABLE, Access ALTER TABLE. INF.03.4: modyfikowanie struktury, zachowanie spójności. Dalej: INSERT.

Przewijanie do góry