7 Datenbank und Tabellen umbauen

7.1 Eine Datenbank ändern

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;

7.2 Eine Datenbank löschen

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.

7.3 Eine Tabelle ändern

7.3.1 Wie kann ich den Namen der Tabelle ändern?

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;

7.3.2 Wie kann ich eine Spalte hinzufügen?

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);

7.3.3 Wie kann ich die Spezifikation einer Spalte ändern?

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;

7.3.4 Zeichenbasierte Spalten in der Länge verändern

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 Zeichen

7.3.5 Zeichensatz verändern

Der Zeichensatz einer Spalte kann geändert werden:

ALTER TABLE mitarbeiter
MODIFY name VARCHAR(100) 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

7.3.6 Zeichenbasierte Spalten in numerische Spalten verändern

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);

7.3.7 Numerische Spalten im Wertebereich verändern

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 Wertebereich

7.3.8 Datum- oder Zeitspalten verändern

Bei 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);

7.3.9 Wie kann ich aus einer Tabelle Spalten entfernen?

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;

7.4 Eine Tabelle löschen

7.4.1 Einfach löschen

Eine Tabelle kann mit DROP TABLE gelöscht werden:

DROP TABLE mitarbeiter;

-- Sicherere Variante
DROP TABLE IF EXISTS mitarbeiter;

7.4.2 Was bedeuten CASCADE und RESTRICT?

Diese Optionen bestimmen das Verhalten bei Fremdschlüsselbeziehungen:

-- 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:

  1. Sichern Sie Ihre Daten:
-- Backup der Tabelle erstellen
CREATE TABLE mitarbeiter_backup 
SELECT * FROM mitarbeiter;
  1. Testen Sie Änderungen:
-- Testlauf für Updates
SELECT COUNT(*) 
FROM mitarbeiter 
WHERE LENGTH(name) > 30;  -- vor Verkürzung von VARCHAR
  1. Verwenden Sie Transaktionen:
START TRANSACTION;
ALTER TABLE mitarbeiter ...
-- Ergebnis prüfen
COMMIT;  -- oder ROLLBACK bei Problemen
  1. Dokumentieren Sie Änderungen:
CREATE TABLE schema_changes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    datum DATETIME,
    beschreibung TEXT,
    sql_befehl TEXT
);