SQL INSERT fügt neue Zeilen in eine Tabelle ein – es ist der DML-Befehl (Data Manipulation Language) zum Schreiben von Daten. Zusammen mit UPDATE (Ändern) und DELETE (Entfernen) bildet es die Schreibseite von SQL; das Lesen übernimmt SELECT.
Grundform
INSERT INTO kunden (name, ort) VALUES ('Erika Mustermann', 'Lübeck');
Nach INSERT INTO folgen Tabellenname und Spaltenliste, dann liefert VALUES die einzufügenden Werte in derselben Reihenfolge. Die Spaltenliste ist optional – ohne sie müssen Werte für alle Spalten in Tabellenreihenfolge stehen, was bei Schemaänderungen schnell bricht. Empfehlung: die Spalten immer explizit nennen.
Mehrere Zeilen auf einmal
INSERT INTO kunden (name, ort) VALUES
('Anna Beispiel', 'Hamburg'),
('Ben Muster', 'Kiel'),
('Carla Test', 'Rostock');
Ein mehrzeiliger INSERT ist deutlich schneller als viele einzelne, weil nur ein Round-Trip zum Server nötig ist.
INSERT … SELECT
INSERT INTO kunden_archiv (id, name, ort)
SELECT id, name, ort FROM kunden WHERE ort = 'Lübeck';
Mit INSERT … SELECT übernimmt man das Ergebnis einer Abfrage direkt in eine andere Tabelle – typisch für Archive, Staging-Bereiche oder Tabellen-Neubauten. Die Spaltenanzahl und Datentypen von SELECT müssen zur Ziel-Tabelle passen.
Upsert und Duplikate
MySQL und MariaDB erweitern INSERT um ON DUPLICATE KEY UPDATE: Stößt der neue Satz auf einen bereits vorhandenen Primär- oder Unique-Schlüssel, wird statt des Einfügens ein UPDATE ausgeführt – der bekannte „Upsert“:
Den gleichen Abgleich übernimmt in Datenbanken mit MERGE-Unterstützung das SQL-MERGE-Statement, das UPDATE und INSERT in einem Befehl kombiniert.
INSERT INTO kunden (id, name, ort) VALUES (42, 'Dora Neu', 'Flensburg')
ON DUPLICATE KEY UPDATE name = 'Dora Neu', ort = 'Flensburg';
INSERT IGNORE wandelt Fehler bei Duplikaten in Warnungen um und fügt nur die konfliktfreien Zeilen ein – praktisch für Massenimporte, kann aber auch unerwartete Daten still verschlucken. Echte Fremdschlüssel-Verletzungen stoppt IGNORE nicht.
Eingefügte ID zurückbekommen
Nach einem INSERT in eine Tabelle mit AUTO_INCREMENT liefert LAST_INSERT_ID() die neu vergebene ID – wichtig, um abhängige Datensätze (etwa Bestellpositionen) zu verknüpfen. MariaDB (seit 10.5), PostgreSQL, SQLite und Oracle können direkt RETURNING nutzen:
INSERT INTO kunden (name) VALUES ('Erika') RETURNING id;
MySQL kennt kein RETURNING – dort übernimmt LAST_INSERT_ID() diese Aufgabe.
Praxis-Tipps
- Vor dem INSERT prüft die Datenbank alle Constraints: CHECK-, UNIQUE- und NOT-NULL-Bedingungen sowie Fremdschlüssel – eine Verletzung bricht das Statement ab.
- Fehlerhafte Zeilen in einem großen Batch: besser in Transaktionen arbeiten, dann lässt sich alles gemeinsam zurückrollen (Transaktion).
- Für sehr große Datenmengen ist
LOAD DATA INFILEbei MySQL/MariaDB oft schneller als Millionen einzelner INSERTs. - Manche Trigger reagieren auf INSERT-Ereignisse – Details in Trigger.
Wer Tabellenstruktur und Schlüssel verstehen will, findet die Grundlagen unter Primär- und Fremdschlüssel und SQL-Grundlagen.