INSERT INTO SELECT
Unterabfragen & Fortgeschrittenes
Bedeutung
Mit INSERT INTO … SELECT fügst du Daten, die eine Abfrage liefert, in eine bereits bestehende Tabelle ein. Anders als SELECT INTO legt es keine neue Tabelle an – die Zieltabelle muss schon existieren und passende Spalten haben.
Syntax
INSERT INTO ziel_tabelle (spalte1, spalte2) SELECT spalteA, spalteB FROM quell_tabelle WHERE bedingung;
Die Reihenfolge und die Datentypen der SELECT-Spalten müssen zu den angegebenen Zielspalten passen.
Beispiel: aktive Kunden archivieren
Es gebe bereits eine Tabelle Kunden_Archiv(KundenID, Name, Stadt). Wir kopieren alle deutschen Kunden hinein:
INSERT INTO Kunden_Archiv (KundenID, Name, Stadt) SELECT KundenID, Name, Stadt FROM Kunden WHERE Land = 'DE';
Die ausgewählten Zeilen werden an die vorhandenen Daten in Kunden_Archiv angehängt.
Beispiel: nur bestimmte Spalten füllen
Du musst nicht alle Spalten befüllen – nicht genannte Spalten bekommen ihren Standardwert oder NULL:
INSERT INTO Kunden_Archiv (KundenID, Name) SELECT KundenID, Name FROM Kunden WHERE Umsatz > 10000;
Mit festen Werten kombinieren
Im SELECT kannst du auch konstante Werte angeben, etwa ein Importdatum:
INSERT INTO Kunden_Archiv (KundenID, Name, Stadt) SELECT KundenID, Name, 'unbekannt' FROM Kunden;
Stolperfalle
Achte darauf, dass die Spaltenanzahl im SELECT exakt zur Spaltenliste der Zieltabelle passt – sonst bricht die Abfrage ab. Verstößt eine eingefügte Zeile gegen eine Einschränkung (z. B. einen doppelten Primärschlüssel KundenID), schlägt der gesamte INSERT fehl. Prüfe Schlüssel und Pflichtfelder vorab.