Bestehende Datenbanken können mit dem ALTER DATABASE
Befehl modifiziert werden. Die häufigsten Änderungen betreffen den
Zeichensatz und die Sortierung:
-- Zeichensatz ändern
ALTER DATABASE firmenverwaltung
CHARACTER SET utf8mb4;
-- Sortierung ändern
ALTER DATABASE firmenverwaltung
COLLATE utf8mb4_unicode_ci;
-- Beides zusammen ändern
ALTER DATABASE firmenverwaltung
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;Eine Datenbank kann mit DROP DATABASE gelöscht
werden:
DROP DATABASE firmenverwaltung;
-- Sicherere Variante
DROP DATABASE IF EXISTS firmenverwaltung;WICHTIG: Dieser Befehl löscht die Datenbank und alle darin enthaltenen Daten unwiderruflich! Vor dem Löschen sollte immer ein Backup erstellt werden.
Der Tabellenname kann mit RENAME TABLE geändert
werden:
-- Eine Tabelle umbenennen
RENAME TABLE mitarbeiter TO personal;
-- Mehrere Tabellen umbenennen
RENAME TABLE
mitarbeiter TO personal,
kunden TO kundschaft;Alternative mit ALTER TABLE:
ALTER TABLE mitarbeiter
RENAME TO personal;Neue Spalten werden mit ALTER TABLE ADD hinzugefügt:
-- Spalte am Ende anfügen
ALTER TABLE mitarbeiter
ADD email VARCHAR(100);
-- Spalte an bestimmter Position einfügen
ALTER TABLE mitarbeiter
ADD telefon VARCHAR(50) AFTER nachname;
-- Spalte als erste Spalte einfügen
ALTER TABLE mitarbeiter
ADD id INT AUTO_INCREMENT PRIMARY KEY FIRST;
-- Mehrere Spalten hinzufügen
ALTER TABLE mitarbeiter
ADD email VARCHAR(100),
ADD telefon VARCHAR(50),
ADD abteilung VARCHAR(50);Spaltenspezifikationen werden mit ALTER TABLE MODIFY
oder ALTER TABLE CHANGE geändert:
-- Nur Datentyp/Eigenschaften ändern (MODIFY)
ALTER TABLE mitarbeiter
MODIFY email VARCHAR(150) NOT NULL;
-- Name und Spezifikation ändern (CHANGE)
ALTER TABLE mitarbeiter
CHANGE email mail_adresse VARCHAR(150) NOT NULL;Bei der Änderung der Länge zeichenbasierter Spalten gilt:
-- Verlängerung ist immer möglich
ALTER TABLE mitarbeiter
MODIFY name VARCHAR(100); -- von VARCHAR(50) auf VARCHAR(100)
-- Verkürzung nur wenn Daten passen
ALTER TABLE mitarbeiter
MODIFY name VARCHAR(30); -- möglich wenn alle Werte ≤ 30 ZeichenDer Zeichensatz einer Spalte kann geändert werden:
ALTER TABLE mitarbeiter
MODIFY name VARCHAR(100)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;Die Umwandlung von Text in Zahlen erfordert besondere Vorsicht:
-- Nur möglich wenn alle Werte gültige Zahlen sind
ALTER TABLE produkte
MODIFY artikelnummer INT;
-- Besser: Erst neue Spalte anlegen und testen
ALTER TABLE produkte
ADD artikelnummer_neu INT;
UPDATE produkte
SET artikelnummer_neu = CAST(artikelnummer AS SIGNED);Bei der Änderung numerischer Datentypen gilt:
-- Erweiterung ist unproblematisch
ALTER TABLE produkte
MODIFY menge BIGINT; -- von INT zu BIGINT
-- Einschränkung nur wenn Daten passen
ALTER TABLE produkte
MODIFY menge SMALLINT; -- nur wenn alle Werte im WertebereichBei der Umwandlung von Datums- und Zeitformaten:
-- Konvertierung zwischen Datums-/Zeittypen
ALTER TABLE termine
MODIFY termin_zeit DATETIME; -- von TIME zu DATETIME
-- Besser: Schrittweise mit Zwischenspalte
ALTER TABLE termine
ADD termin_zeit_neu DATETIME;
UPDATE termine
SET termin_zeit_neu = CAST(termin_zeit AS DATETIME);Spalten werden mit ALTER TABLE DROP entfernt:
-- Eine Spalte löschen
ALTER TABLE mitarbeiter
DROP COLUMN telefon;
-- Mehrere Spalten löschen
ALTER TABLE mitarbeiter
DROP COLUMN telefon,
DROP COLUMN fax;Eine Tabelle kann mit DROP TABLE gelöscht werden:
DROP TABLE mitarbeiter;
-- Sicherere Variante
DROP TABLE IF EXISTS mitarbeiter;Diese Optionen bestimmen das Verhalten bei Fremdschlüsselbeziehungen:
RESTRICT (Standard): Verhindert das Löschen wenn
Abhängigkeiten bestehenCASCADE: Löscht auch alle abhängigen Objekte-- Bei Erstellung der Fremdschlüsselbeziehung festlegen
CREATE TABLE bestellungen (
id INT PRIMARY KEY,
kunde_id INT,
FOREIGN KEY (kunde_id)
REFERENCES kunden(id)
ON DELETE CASCADE
);Tipps für Datenbankänderungen:
-- Backup der Tabelle erstellen
CREATE TABLE mitarbeiter_backup
SELECT * FROM mitarbeiter;-- Testlauf für Updates
SELECT COUNT(*)
FROM mitarbeiter
WHERE LENGTH(name) > 30; -- vor Verkürzung von VARCHARSTART TRANSACTION;
ALTER TABLE mitarbeiter ...
-- Ergebnis prüfen
COMMIT; -- oder ROLLBACK bei ProblemenCREATE TABLE schema_changes (
id INT AUTO_INCREMENT PRIMARY KEY,
datum DATETIME,
beschreibung TEXT,
sql_befehl TEXT
);