![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite4Delphi Wrapper von Tim Anderson
Abfrage: Ist Datensatz bereits vorhanden?
Hallo da draußen,
für mein Programm muss ich in meiner Datenbank feststellen ob ein Datensatz bereits vorhanden ist oder noch nicht. Wie stelle ich dies nun am Besten an? Ausgabe als Boolean wäre wünschenswert. Viele Grüße, BenneX |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Ohne Programmierung erst einmal.
Wie lässt sich der Datensatz identifizieren? Danach gehts weiter ... ;-) |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Über eine Eindeutigkeit, bspw.
Delphi-Quellcode:
SELECT * FROM Kunden WHERE Name=Mustermann
Mustermann hab ich gegeben, jetzt möchte ich herausfinden ob ich den Datensatz UPDATEN muss oder neu erstellen muss - und genau dies ist mein Problem :-/ |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Na wenn es einen Datensatz mit diesem Namen gibt (Mustermann), dann musst also einen Eintrag erstellen, andernfalls updaten.
Also du stellst diese SQL-Select-Abfrage und erhälst ja ein Ergebnis. Erst einmal egal, mit welchem Inhalt. Nun gut, überlege weiter. Zwei Zustände gibt es also. Datensatz da oder nicht. Wie könnte der sich z.B. bei der SELECT-Abfrage im Ergebnis unterscheiden? Und könntest Du etwas damit anfangen? |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Manche SQL Dialekte unterstützen direkt eine "UPDATE OR INSERT"-Funktion. Wie diese genau aussieht, hängt von deinem DMBS ab.
Edit: Für SQLite scheint es dafür ![]() |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
Die effektivste Möglichkeit um herauszubekommen, ob ein Datensatz existiert, wäre imho ein ANY oder EXISTS:
SQL-Code:
Das konkrete Problem (insert or update) ist natürlich bereits von Medium beantwortet.select case when exists ( select 1 from Tabelle where Name='Mustermann' ) then 1 else 0 end; |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Warum so umständlich?
- SubSelect? - das innere Select gibt schon deine 1 zurück und bei "0" halt Nichts - aber vorallem "case when" ist doch sinnlos? - - Auf die Frage gibt es als Antwort Ja oder Nein ... wozu also diese Antwort nochmal in 0 oder 1 umwandeln? - -
SQL-Code:
select exists(select 1 from Tabelle where Name='Mustermann'); -- 1, true, *, irgendwas ... egal
PS: Zitat:
SQL-Code:
SELECT true FROM table WHERE id = :id
Entweder gibt es einen Datensatz mit True oder es gibt keinen Datensatz. Da es eh immer nur True geben kann, braucht man also nur die Anzahl der Datensätze prüfen (RecordCount/Empty/EOF) und der Inhalt ist praktisch egal. |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Eigentlich ist schon alles gesagt, ich möchte nur anmerken, dass "Mustermann", also ein Name, idR nicht taugt, um eine Eindeutigkeitzu bestimmen.
Technisch gibt es dafür Primärschlüssel, logisch gibt es dafür Kundennummern bspw oder Kombinationen aus verschiedenen Feldern wie Name, Geburtsdatum, Adresse. Die werden dann von einem Menschen abgerufen und verglichen und der entscheidet sich dann für einen der Datensätze und dieser eine Datensatz kann über den technischen Primärschlüssel haargenau identifiziert und upgedated werden. Wenn Du in die Verlegenheit kommen solltest, anhand eines mehrdeutigen Kriteriums den zu ändernden Datensatz bestimmen zu müssen, ist irgendwas schiefgelaufen. Ob CSV mit Datenaktualisierung Anforderung aus der Sachbearbeitung oder was auch immer Es werden immer eindeutige Kriterien benötigt. |
AW: Abfrage: Ist Datensatz bereits vorhanden?
"Eindeutigkeit" ist hier das wichtige Stichwort. In einer Adressdatenbank wird ein Klaus Müller oder Manfred Fischer problemlos mehrmals auftauchen. Handelt es sich hierbei um Personen mit mehr als einer Adresse oder handelt es sich um zwei unterschiedliche Personen? Und dann ist ja auch die Frage was in der DB fehlt. Liegen beispielsweise Städte und Postleitzahlen in einer Tabelle oder in zwei getrennten Tabellen?
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz