Ergebnis 1 bis 5 von 5
  1. #1
    Mitglied
    Registriert seit
    Jan 2008
    Beiträge
    36
    Danksagungen
    2

    Standard [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:

    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')
    Nun erhalte ich aber folgende Fehlermeldung:
    Code:
    cur.execute(sql)
    sqlite3.OperationalError: near "WHERE": syntax error
    SQLite ist auf Version 3.7.12.

    Vielleicht ist es auch einfach nur sehr spät und ich finde morgen selbst meinen Schussel- oder Denkfehler, trotzdem danke im Voraus.

    Grüße
    Geändert von crupf28 (10. 02. 2013 um 13:50 Uhr)

  2. #2
    Mitglied Avatar von stefbrot
    Registriert seit
    May 2006
    Ort
    An meinem PC
    Beiträge
    2.845
    Danksagungen
    62

    Standard 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:
    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')
    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.

  3. #3
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2008
    Beiträge
    36
    Danksagungen
    2

    Standard 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

    Code:
    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)
        """
    Grüße
    Geändert von crupf28 (10. 02. 2013 um 13:28 Uhr)

  4. #4
    Mitglied Avatar von stefbrot
    Registriert seit
    May 2006
    Ort
    An meinem PC
    Beiträge
    2.845
    Danksagungen
    62

    Standard Re: [SQLite] Syntax Fehler bei INSERT ... WHERE NOT EXISTS ...

    Zitat Zitat von crupf28 Beitrag anzeigen
    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.
    Man kann auch kombinierte UNIQU constraints machen.

    Zitat Zitat von crupf28 Beitrag anzeigen
    Heißt das, dass ich dann unbedingt eine temporäre Tabelle dual von den einzufügenden Datensätzen brauche?
    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.

    Zitat Zitat von crupf28 Beitrag anzeigen
    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)
    Das ist komisch, welches SQL Statement verwendest du dafür genau?

  5. #5
    Mitglied

    (Threadstarter)


    Registriert seit
    Jan 2008
    Beiträge
    36
    Danksagungen
    2

    Standard 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

    Man kann auch kombinierte UNIQU constraints machen.
    Gut zu wissen, vielleicht bau ich alles nochmal so um, dass es konsistenter wird.

  6.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •