Wie vermeide ich bei INSERT ... SELECT Fehler, wenn das UNIQUE-Feld bereits existiert?

Antwort vom

**Wenn `feldA` `UNIQUE` ist, musst du nur Werte einfügen, die in `tabelleA` noch nicht existieren – sonst läuft das `INSERT` auf einen Duplicate-Fehler.** Am saubersten ist meist diese Variante: ```sql INSERT INTO tabelleA (feldA) SELECT b.feldB FROM tabelleB b WHERE b.feldB IN (2,3,51,71) AND NOT EXISTS ( SELECT 1 FROM tabelleA a WHERE a.feldA = b.feldB ); ``` ## Warum das der richtige Weg ist Dein ursprüngliches Statement versucht alle gefundenen Werte einzufügen. Sobald einer davon schon in `tabelleA.feldA` vorhanden ist, schlägt das `INSERT` wegen `UNIQUE` fehl. Mit `NOT EXISTS` filterst du diese Werte vorher heraus. Dadurch werden nur neue Werte eingefügt. ## Wichtiger Unterschied `NOT EXISTS` ist meist besser als einfach den Fehler zu „unterdrücken“, weil du damit die Ursache sauber vermeidest statt nur die Fehlermeldung zu umgehen. Falls `tabelleB` selbst denselben Wert mehrfach liefern kann, ist `DISTINCT` sinnvoll: ```sql INSERT INTO tabelleA (feldA) SELECT DISTINCT b.feldB FROM tabelleB b WHERE b.feldB IN (2,3,51,71) AND NOT EXISTS ( SELECT 1 FROM tabelleA a WHERE a.feldA = b.feldB ); ``` ## Datenbankspezifisch Je nach Datenbank gibt es auch Kurzformen: - **MySQL:** `INSERT IGNORE ...` - **PostgreSQL:** `ON CONFLICT DO NOTHING` - **SQLite:** `INSERT OR IGNORE ...` Beispiel für PostgreSQL: ```sql INSERT INTO tabelleA (feldA) SELECT feldB FROM tabelleB WHERE feldB IN (2,3,51,71) ON CONFLICT (feldA) DO NOTHING; ``` Die robusteste allgemeine SQL-Lösung ist aber `INSERT ... SELECT ... WHERE NOT EXISTS`.

Kategorie: Technik Tags: SQL Insert Unique