DML — Daten manipulieren
M164 Block 4 von 5 — INSERT, UPDATE, DELETE
DML-Befehle verändern den Datenbestand dauerhaft und ohne Rückfrage. Ein fehlendes WHERE betrifft alle Zeilen der Tabelle!

INSERT — Daten einfügen

INSERT INTO fügt neue Zeilen in eine Tabelle ein. Die Spalten werden in Klammern aufgelistet, danach folgen die Werte mit VALUES.

-- Einen Datensatz einfügen (empfohlen: explizite Spalten)
INSERT INTO kunden (vorname, nachname, land)
VALUES ('Hans', 'Meier', 'CH');

-- Mehrere Datensätze auf einmal
INSERT INTO kunden (vorname, nachname)
VALUES ('Anna', 'Müller'),
       ('Roni', 'Bauer'),
       ('Milan', 'Keller');

-- Aus einer anderen Tabelle kopieren (INSERT + SELECT)
INSERT INTO kunden_archiv (vorname, nachname)
SELECT vorname, nachname FROM kunden
WHERE land = 'DE';

Spalten mit NOT NULL ohne DEFAULT-Wert müssen immer angegeben werden — sonst wirft SQL einen Fehler.

UPDATE — Daten ändern

UPDATE ändert Felder in bestehenden Datensätzen. Mit SET werden die neuen Werte angegeben. Mehrere Spalten werden durch Komma getrennt.

-- Einen bestimmten Kunden aktualisieren
UPDATE kunden
SET nachname = 'Meyer', land = 'DE'
WHERE kundenid = 2;

-- Alle Kunden mit Nachname 'Meier' umbenennen
UPDATE kunden
SET nachname = 'Meyer'
WHERE nachname = 'Meier';
Ohne WHERE werden alle Zeilen der Tabelle geändert! Vor einem UPDATE immer zuerst mit SELECT prüfen welche Zeilen betroffen wären.
-- GEFÄHRLICH: Alle Kunden erhalten land = 'DE'
UPDATE kunden SET land = 'DE';

-- BESSER: Erst prüfen
SELECT * FROM kunden WHERE nachname = 'Meyer';
-- Dann erst UPDATE ausführen

DELETE — Daten löschen

DELETE FROM löscht ganze Zeilen aus einer Tabelle. Mit WHERE wird eingeschränkt welche Zeilen betroffen sind.

-- Einen bestimmten Datensatz löschen
DELETE FROM produkte WHERE produktid = 5;

-- Alle inaktiven Kunden löschen
DELETE FROM kunden WHERE status = 'inaktiv';
Ohne WHERE werden alle Zeilen der Tabelle gelöscht! Der Befehl kann nicht rückgängig gemacht werden (ausser mit Transaktionen).

DELETE vs. TRUNCATE:

MerkmalDELETETRUNCATE
Einzelne Zeilen löschbar✅ Ja (mit WHERE)❌ Nein (immer alles)
Protokollierung✅ Ja (langsamer)❌ Nein (schneller)
IDENTITY-ZählerWird nicht zurückgesetztWird zurückgesetzt
WHERE-Klausel✅ Möglich❌ Nicht möglich

Referentielle Integrität & Cascading

Wenn ein Fremdschlüssel aus einer anderen Tabelle auf den zu löschenden Datensatz zeigt, schlägt das DELETE mit einem Fehler fehl:

-- Fehler! Kunde 2 hat noch Bestellungen → FK-Verletzung
DELETE FROM kunden WHERE kundenid = 2;

Lösung 1: Abhängige Datensätze zuerst löschen. Lösung 2: ON DELETE CASCADE beim Fremdschlüssel aktivieren — dann werden Child-Datensätze automatisch mitgelöscht:

-- Fremdschlüssel mit Cascade-Option
ALTER TABLE bestellungen
ADD CONSTRAINT fk_bestell_kunde
  FOREIGN KEY (kundenid)
  REFERENCES kunden(kundenid)
  ON DELETE CASCADE;

-- Jetzt löscht dieses Statement den Kunden UND seine Bestellungen
DELETE FROM kunden WHERE kundenid = 2;