-
10. 02. 2013, 04:04 #1Mitglied
- Registriert seit
- Jan 2008
- Beiträge
- 30
- Danksagungen
- 1
[gelöst][SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...
Hallo, ich versuche derzeit ein Python-Script zu schreiben, das bei Ausführung einen bestimmten Satz von gleich strukturierten CSV-Dateien erst einliest, ein bisschen umkonvertiert und später in eine SQLite-Datenbank überträgt.
Soweit so gut, jedoch habe ich öfters doppelte Einträge (ich bekomme die CSVs nunmal so).
Ich könnte zwar regelmäßig die Datenbank warten, aber das möchte ich mir ersparen.
Also habe ich nach Lösungen gesucht, wovon folgende am vielversprechendsten aussah:
Nun erhalte ich aber folgende Fehlermeldung:Code:INSERT INTO tabelle (integer1, integer2, integer3, text1, text2, text3, text4, text5) VALUES (123, 456, 789, '2000-01-01', '20:15, 'PRO7', '21:45', 'KABEL1') WHERE NOT EXISTS (SELECT * FROM tabelle WHERE integer1 = 123 AND integer2 = 456 AND text1 = '2000-01-01')
SQLite ist auf Version 3.7.12.Code:cur.execute(sql) sqlite3.OperationalError: near "WHERE": syntax error
Vielleicht ist es auch einfach nur sehr spät und ich finde morgen selbst meinen Schussel- oder Denkfehler, trotzdem danke im Voraus.
GrüßeGeändert von crupf28 (10. 02. 2013 um 13:50 Uhr)
-
10. 02. 2013, 09:23 #2
Re: [SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...
Wenn du VAULES verwendest, darfst du kein WHERE anhängen. Du könntest ein SELECT verwenden:
Du könntest auch einfach ein UNIQUE CONSTRAINT zur Tabelle hinzufügen, dann können einfach keine Daten eingefügt werden die schon drin sind ganz ohne kompliziertes insert.Code:INSERT INTO tabelle (integer1, integer2, integer3, text1, text2, text3, text4, text5) SELECT 123, 456, 789, '2000-01-01', '20:15, 'PRO7', '21:45', 'KABEL1' FROM dual WHERE NOT EXISTS (SELECT * FROM tabelle WHERE integer1 = 123 AND integer2 = 456 AND text1 = '2000-01-01')
-
10. 02. 2013, 11:50 #3Mitglied
(Threadstarter)
- Registriert seit
- Jan 2008
- Beiträge
- 30
- Danksagungen
- 1
Re: [SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...
Danke für die Antwort.
Einzelne Felder sollen ja doppelt vorkommen können (z. B. soll es mehrere Einträge geben dürfen, bei denen integer1 gleich ist), aber eben nicht die drei Felder kombiniert.
Heißt das, dass ich dann unbedingt eine temporäre Tabelle dual von den einzufügenden Datensätzen brauche?
edit:
Nun wird bei jedem INSERT jeder Datensatz in tabelle abgerufen und jedesmal wenn der einzufügende Datensatz nicht mit dem abgerufenen Datensatz übereinstimmt, wird er eingefügt.
Soll heißen, der z.B. 30. Datensatz wird zum Beispiel 26 mal eingefügt. (4 mal existiert er bereits)
edit2:
ist erledigt. Wie folgt gelöst:
1) Frische Tabelle dual erstellen
2) Alle Datensätze aus den CSVs dort einlesen
3) Mit folgendem einmalig ausgeführtem SQL Query in die eigentliche Tabelle einfügen
4) profit, noch die Hilfstabelle dual löschen
GrüßeCode:sql = """ INSERT INTO tabelle (integer1, integer2, integer3, text1, text2, text3, text4, text5) SELECT * FROM dual WHERE NOT EXISTS (SELECT NULL FROM tabelle WHERE tabelle.integer1 = dual.integer1 AND tabelle.integer2 = dual.integer2 AND tabelle.text1 = dual.text1) """Geändert von crupf28 (10. 02. 2013 um 13:28 Uhr)
-
10. 02. 2013, 13:35 #4
Re: [SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...
Man kann auch kombinierte UNIQU constraints machen.
dual ist bei manchen Datenbanksystemen eine "Pseudotabelle", die immer vorhanden ist und für soche Abfragen benutzt wird, die eigentlich gar keine Tabelle brauchen. Ob SQLite das unterstützt weiß ich jetzt nicht, kann natürlich sein, dass das gar nicht funktioniert.
Das ist komisch, welches SQL Statement verwendest du dafür genau?
-
10. 02. 2013, 13:56 #5Mitglied
(Threadstarter)
- Registriert seit
- Jan 2008
- Beiträge
- 30
- Danksagungen
- 1
Re: [gelöst][SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...
Uff, naja, ob SQLite dual dann so unterstützt weiß ich auch nicht, aber mit der Hilfstabelle funktionierts ja jetzt wie gewünscht.
Den ursprünglichen Query habe ich jetzt leider gelöscht
Gut zu wissen, vielleicht bau ich alles nochmal so um, dass es konsistenter wird.Man kann auch kombinierte UNIQU constraints machen.
-


Zitieren

mehr lesen...







Guild Wars 2 wird günstiger
Gestern, 15:38 in gulli:news