Hallo,
ich möchte ganz einfach prüfen ob ein Datensatz in SQLite existiert.
Gibts dafür nen Befehl?
LG
Schweizergeizer
SQLite prüfen ob Datensatz existiert
-
- [ gelöst ]
-
Schweizergeizer -
8. September 2014 um 16:59 -
Erledigt
-
-
- Offizieller Beitrag
Das ist doch kein SQLite Problem.
Führe ein Query mit der Abfrage auf diesen Datensatz aus (Bedingungen wie Index od. DS-Nr. etc. kennst nur du) und werte die Rückgabe aus. -
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,
[autoit]
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&"');")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]
[/autoit]
_SQLite_Exec($hDB, "SELECT * IN Leser WHERE Nummer = "&$f1&";")
und dann eben gucken was man zurückkriegt,
oder?LG
Schweizergeizer -
Eher so:
[autoit]_SQLite_Exec($hDB, "SELECT * FROM Leser WHERE Nummer='"&$f1&"';")
[/autoit] -
danke schön
-
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]
[/autoit] [autoit][/autoit] [autoit]
; Deklaration
Local $hQuery, $aResult, $iRows, $iColumns, $aColumns
Local $sQuery = "SELECT * FROM Leser WHERE Nummer = '" & $f1 & "';"; Aufruf des Statements (Ergebnis wird in $aResult gespeichert)
[/autoit] [autoit][/autoit] [autoit]
_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; weiteres Verfahren mit dem Ergebnis in $aResult
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay( $aResult ); ...
[/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 【ツ】
-
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]
[/autoit] [autoit][/autoit] [autoit]
; Deklaration
Local $hQuery, $aResult, $iRows, $iColumns, $aColumns
Local $sQuery = "SELECT * FROM Leser WHERE Nummer = '" & $f1 & "';"; Aufruf des Statements (Ergebnis wird in $aResult gespeichert)
[/autoit] [autoit][/autoit] [autoit]
_SQLite_Startup() ; startet SQLite
$hDB = _SQLite_Open( ) ; 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; weiteres Verfahren mit dem Ergebnis in $aResult
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay( $aResult ); ...
[/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 -
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:
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:
Wenn du das einmal gemacht hast kannst du dein Insert absofort folgendermaßen schreiben:Der Datensatz wird hierbei nur dann eingefügt, wenn die Nummer noch nocht nicht existiert.
-
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
... 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 【ツ】
-
Jo - das ist durchaus fehlerhaft.
Keine Ahnung wie ich da auf das "IN" kam...