SQLite prüfen ob Datensatz existiert

  • Hallo Schweizergeizer,

    BugFix hat absolut recht - hängt von deinen Einschränkungen in der WHERE-Klausel ab. Aber vielleicht meinst du was anderes? Schick doch mal ein konkretes Beispiel bzw. erläutere dies etwas genauer, damit wir besser Hilfestellung geben können. Ich nehme an, dass dir SQL und dessen Syntax soweit bekannt sind oder?

    Vielen Dank für etwaige Unterstützung (Ideen, Verbesserungsvorschläge, Kritik und Zustimmung).
    Einen angenehmen Tag noch!

    UserIsGrateful 【ツ】

  • Ich kenne mich mit SQL ziemlich wenig aus,
    aber kann zumindest was mit dem Code anfangen, wenn ich ihn sehe.
    Das ist mein DB Aufruf:

    [autoit]


    _SQLite_Exec($hDB, "INSERT INTO Leser (Nummer,Nachname,Vorname,Adresse,Telefonnummer) VALUES ('"&$f1&"','"&$f2&"','"&$f3&"','"&$f4&"','"&$f5&"');")

    [/autoit]

    wie muss das jetzt syntax mäßig aussehen, wenn ich prüfen will ob es nen Eintrag mit der Nummer schon gibt?

    meine Vermutung:

    [autoit]


    _SQLite_Exec($hDB, "SELECT * IN Leser WHERE Nummer = "&$f1&";")

    [/autoit]


    und dann eben gucken was man zurückkriegt,
    oder?

    LG
    Schweizergeizer

  • Hallo Schweizergeizer,

    _SQLite_Exec() bearbeitet keine Ergebnisse. Du kannst damit arbeiten, gerade für INSERT-Statements nicht verkehrt, aber je nach Gebrauch ist folgendes für deine Vorabprüfung wohl sinnvoller bzw. ist dies eine weitere Möglichkeit.

    Mögliche Variante (ungetestet):

    Spoiler anzeigen
    [autoit]


    ; Deklaration
    Local $hQuery, $aResult, $iRows, $iColumns, $aColumns
    Local $sQuery = "SELECT * FROM Leser WHERE Nummer = '" & $f1 & "';"

    [/autoit] [autoit][/autoit] [autoit]

    ; Aufruf des Statements (Ergebnis wird in $aResult gespeichert)
    _SQLite_Startup() ; startet SQLite
    $hDB = _SQLite_Open( <SQLite_DB_Pfad> ) ; startet deine "..."-Datenbank
    _SQLite_Query( $hDB, $sQuery, $hQuery ) ; query statement ($sQuery entspricht deinem SELECT)
    _SQLite_GetTable2d( $hDB, $sQuery, $aResult, $iRows, $iColumns ) ; Spaltentext und alle Datensätze in der Tabelle
    _SQLite_FetchNames( $hQuery, $aColumns ) ; gibt die Spalten als Liste
    _SQLite_Shutdown() ; verwirft SQLite.dll

    [/autoit] [autoit][/autoit] [autoit]

    ; weiteres Verfahren mit dem Ergebnis in $aResult
    _ArrayDisplay( $aResult )

    [/autoit] [autoit][/autoit] [autoit]

    ; ...
    ; ...

    [/autoit]


    Wenn ich dich richtig verstehe, möchtest du erst prüfen ob und falls nein, dann INSERT oder?

    Vielen Dank für etwaige Unterstützung (Ideen, Verbesserungsvorschläge, Kritik und Zustimmung).
    Einen angenehmen Tag noch!

    UserIsGrateful 【ツ】

  • klappt wunderbar,
    dankeschön :)

    Einmal editiert, zuletzt von Schweizergeizer (8. September 2014 um 18:49)

  • Natürlich kannst du auch direkt in Sqlite das Vorhandensein eines Datensatzes prüfen.
    Ist auch effizienter.

    Für deinen Fall würde die Query in Sqlite so aussehen:

    SQL
    SELECT EXISTS(SELECT * IN Leser WHERE Nummer = 1);

    Als Rückgabe erhält man bei Existenz eine 1, bei Nichtexistenz eine 0.

    Aber eigentlich willst du das scheinbar gar nicht wissen.
    Deine eigentliche Frage lautete wahrscheinlich eher (Siehe XY-Problem...): Wie kann ich in Sqlite einen Datensatz nur dann hinzufügen wenn er nicht schon existiert?
    Das geht auch ziemlich einfach in Sqlite.
    Hierzu musst du Sqlite erst einmal sagen, dass Nummer nur jeweils einmal vorkommen darf und wenn diese Bedingung verletzt wird der jeweilige Befehl ignoriert wird:

    SQL
    ALTER TABLE Leser ADD CONSTRAINT UQ_Nummer UNIQUE(Nummer) ON CONFLICT IGNORE;


    Wenn du das einmal gemacht hast kannst du dein Insert absofort folgendermaßen schreiben:

    SQL
    INSERT OR IGNORE INTO Leser (Nummer,...) VALUES (...)

    Der Datensatz wird hierbei nur dann eingefügt, wenn die Nummer noch nocht nicht existiert.

    Einmal editiert, zuletzt von AspirinJunkie (8. September 2014 um 21:14)

  • Hallo Schweizergeizer, hallo AspirinJunkie,

    AspirinJunkie hat ganz recht. So sollte man es umsetzen. Aber, AspirinJunkie - ein kleiner Kopierfehler scheint dir da unterlaufen zu sein...

    IST / SOLL:

    Spoiler anzeigen
    SQL
    -- IST:
    SELECT EXISTS(SELECT * IN   Leser WHERE Nummer = 1);
    -- SOLL:
    SELECT EXISTS(SELECT * FROM Leser WHERE Nummer = 1);


    ... außer dies war Absicht, aber mir ist für ANSI-SQL (92) kein SELECT * IN bekannt. Naja, ist ja gelöst ;) .

    Vielen Dank für etwaige Unterstützung (Ideen, Verbesserungsvorschläge, Kritik und Zustimmung).
    Einen angenehmen Tag noch!

    UserIsGrateful 【ツ】