Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz suchen, mit SQL Integrität prüfen (https://www.delphipraxis.net/67986-datensatz-suchen-mit-sql-integritaet-pruefen.html)

ils566 22. Apr 2006 23:13

Datenbank: mysql • Version: 5 • Zugriff über: mydac

Datensatz suchen, mit SQL Integrität prüfen
 
Hallo,

wie lässt sich mit SQL am besten und möglichst perfomant prüfen, ob ein Datensatz in einer Tabelle existiert?

Als Beispiel:
In einer Tabelle 'Personen' soll geprüft werden, ob die PersonaID=1 vorhanden ist.

Grüße
ils

mkinzler 22. Apr 2006 23:17

Re: Datensatz suchen, mit SQL Integrität prüfen
 
z.B.
SQL-Code:
select count(PersonaID) as anz from <tabelle> where PersonaID1=1;

Jelly 22. Apr 2006 23:18

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Deine Frage hat nix mit Integritätsprüfung zu tun... Aber um einen Datensatz auf Existenz zu prüfen, mach ich immer so:

SQL-Code:
select count(id) as N from Tabelle where id = 123
Steht nachher in N = 0, so gibts den Datensatz net.

Alterativ kannst Du natürlich auch
SQL-Code:
select * from Tabelle where id = 123
musst dann aber in Delphi noch irgendwie abfragen, ob überhaupt ein Datensatz geliefert wurde. Und unter Umständen (je nach abfrage), können viel zu viele Datensätze übermittelt werden, was ja für die reine Existenzfrage irrelevant ist... Deshalb ist erstere Abfrage auf jeden Fall vorzuziehen.

ils566 22. Apr 2006 23:39

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Hallo,

danke für eure schnellen und hilfreichen antworten.

Es hat funktioniert. Ich möchte halt sicherstellen, dass die PersonenID tatsächlich existiert,
da ich die ID in der Tabelle 'vorstellung' im Feld 'PersonenID' eintrage.

Wie würdet ihr die referentielle Integrität prüfen?

Grüße
ils

mkinzler 22. Apr 2006 23:43

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Wenn die datenbank es unterstützt, direkt in den Metdaten. (foreign key Definition), LookUp-Komponenten oder wie oben ausgeführt durch Abfrage.

Hansa 23. Apr 2006 01:50

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Was hat da ein Count drin zu suchen ?

Zitat:

Zitat von ils566
...und möglichst perfomant prüfen, ob ein Datensatz in einer Tabelle existiert?
...soll geprüft werden, ob die PersonaID=1 vorhanden ist.

Dafür hat man Stored Procedures und Rückgabewerte. Und auch in der SP kann einiges dann in der DB gleich mit ausgeführt werden. Count ist da wirklich nicht das Gelbe vom Ei.

SQL-Code:
vorhanden = -1;
select ID from PERSONAL where PersonaID=1 into :vorhanden;
if vorhanden = -1 then
...
Ist sie da, dann steht in vorhanden keine -1 mehr, ansonsten schon. Und das kann für eigene Zwecke dann weiter ausgewertet werden. Vor allem wird lediglich ein integer als Ergebnismenge ausgewertet.

Jelly 23. Apr 2006 07:44

Re: Datensatz suchen, mit SQL Integrität prüfen
 
[quote="Hansa"]
SQL-Code:
vorhanden = -1;
select ID from PERSONAL where PersonaID=1 into :vorhanden;
if vorhanden = -1 then
...
[/hansa]
Das halte ich für einen total misslungenen Versuch, noch eine weitere Lösung zu suchen. Deine SP schlägt fehl, nämlich an 2 Stellen:
1. Was, wenn die ID=-1 tatsächlich in der Tabellenspalte ID existiert
2. Was, wenn mehrere Datensätze mit der gesuchten ID existieren. Dann gibts wohl ne Exception :gruebel:

alzaimar 23. Apr 2006 10:48

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Zitat:

Zitat von Jelly
Das halte ich für einen total misslungenen Versuch, noch eine weitere Lösung zu suchen. Deine SP schlägt fehl, nämlich an 2 Stellen:
1. Was, wenn die ID=-1 tatsächlich in der Tabellenspalte ID existiert

Manno, dann eben auf -1000, NULL, 123234545 oder sonstwas prüfen.
Zitat:

Zitat von Jelly
2. Was, wenn mehrere Datensätze mit der gesuchten ID existieren. Dann gibts wohl ne Exception :gruebel:

Bei mySQL weiss ich das nicht, bei MSSQL jedenfalls nicht. Aber es gibt doch ein 'Select TOP 1' oder so auch bei mySQL, oder?

Zitat:

Zitat von Jelly
SQL-Code:
select count(id) as N from Tabelle where id = 123

:wall: Und was ist, wenn es 1000000 Einträge der ID=123 gibt? Dann dauert die Integritätsprüfung ziemlich lange... Ist natürlich weit hergeholt, entspricht aber deinem Kritkniveau. :zwinker: Aggregatfunktionen sollten nicht für solche fundamentalen Abfragen auf Integrität verwendet werden, dafür sind sie einfach nicht gedacht. Aber klar, gehen tut alles.

Soweit ich weiss, gibt es einen exists-Operator bei SQL, inwieweit mySQL das kann, weiss ich aber nicht:
SQL-Code:
If Exists (select * from Tabelle where id = 123)
Das bricht sofort ab, sobald ein Eintrag gefunden wurde, vermeidet also den Extemfall der 1000000 Einträge von Jellys Idee.

Falls mySQL das nicht kennt, würde ich Hansas Version verwenden. Sie ist dann optimal (sofern es ein "Select TOP 1") gibt.

Natürlich muss die Spalte IDE indiziert sein, das nur so am Rande.

Hansa 23. Apr 2006 15:55

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Ich bin doch etwas erstaunt, wozu die IDs der Datensätze offensichtlich von einigen mißbraucht werden. Vielleicht liegt nur ein Abweichung vom allgemeinen Sprachgebrauch vor. :zwinker: Für mich dient eine ID wie der Name schon sagt zur eindeutigen Identifizierung eines Datensatzes. Insofern ist sie eindeutig ! Alleine schon deshalb ist ein count völlig überflüssig. Wer sich an solche Regeln nicht hält, der wird irgendwann böse aufwachen. Negative IDs lasse ich mir ja noch gefallen, bloß wozu ? Werden die IDs von 0 ab hochgezählt, so geht mein Ansatz definitiv genau so. Mißlingen wird der nie. Alzaimers EXIST ist im Prinzip dasselbe wie das von mir, aber eventuell DB-abhängig. SELECT INTO dürfte jede SQL-DB verstehen. Der Fragesteller hat übrigens auch das Wort "Integrität" gebraucht. Und das hat schon was mit dem Kontext zu tun.

@Jelly : erkläre mir mal wie Du folgendes löst : x Rechnungen haben eine bestimmte Artikelposition. Genau díe Art.Nr. dieses Artikels muß geändert werden. Was passiert mit den Rechnungen ? Die sollen nämlich mit der neuen Art.Nr. wieder neu gedruckt werden.

Jelly 23. Apr 2006 17:26

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Hansa, ich hab schon verstanden was eine ID im Normalfall ist, hab ja auch bereits einige DB Anwendungen erstellt. Mir brauchst Du das nicht sagen. Aber so "laienhaft" die Frage vom Threadersteller gestellt war (nicht bös gemeint), wollt ich nur darauf hinweisen, dass deine Methode nicht zwangsläufig in jedem Fall passt.

Hansa 23. Apr 2006 19:48

Re: Datensatz suchen, mit SQL Integrität prüfen
 
Zitat:

Zitat von Jelly
...Mir brauchst Du das nicht sagen. Aber so "laienhaft" die Frage vom Threadersteller gestellt war (nicht bös gemeint), wollt ich nur darauf hinweisen, dass deine Methode nicht zwangsläufig in jedem Fall passt.

Die Problematik ist alles andere als laienhaft ! Allerdings mit sehr einfachen Mitteln zu bewältigen. Die Methode paßt schon, es sein denn es werden keinerlei Regeln betreffend Datenintegrität eingehalten, e.g. nicht eindeutige IDs. Siehe hier :

Zitat:

Zitat von Jelly
Deine Frage hat nix mit Integritätsprüfung zu tun... Aber um einen Datensatz auf Existenz zu prüfen, mach ich immer so:

SQL-Code:
select count(id) as N from Tabelle where id = 123
Steht nachher in N = 0, so gibts den Datensatz net.

Alterativ kannst Du natürlich auch.. können viel zu viele Datensätze übermittelt werden, was ja für die reine Existenzfrage irrelevant ist... Deshalb ist erstere Abfrage auf jeden Fall vorzuziehen.

Mit meinem Parameter :vorhanden mache ich ja noch einiges mehr. Z.B. lasse ich die DB entscheiden, ob ein Insert oder Update gemacht wird. Bei -1 Insert usw. Ich kann mir einzelne Felder rauspicken und direkt beim Insert vorbesetzen oder noch ganz andere Dinge machen. Du wirst auch von jedem anständigen Programmierer hören, wo es nur geht, SPs zu verwenden. Das hier ist ein Paradebeispiel dafür.

Es fehlt übrigens noch eine Antwort auf diese Frage :

Zitat:

Zitat von Hansa
@Jelly : erkläre mir mal wie Du folgendes löst : x Rechnungen haben eine bestimmte Artikelposition. Genau díe Art.Nr. dieses Artikels muß geändert werden. Was passiert mit den Rechnungen ? Die sollen nämlich mit der neuen Art.Nr. wieder neu gedruckt werden.

Ach ja, fehlt auch noch. Ich mache das so : die Art.Nr. wird eben geändert. :mrgreen:

ils566 23. Apr 2006 21:11

Re: Datensatz suchen, mit SQL Integrität prüfen
 
@all

danke für die rege Beteiligung. Es freut mich, dass die Fragestellung grünlich analysiert wird und verschiedene Lösungsansätze diskutiert werden.

In meinem Fall ist die Id eineindeutig und als PRIMARY key definiert.

Was uns alle interessieren dürfte, ist die Frage ob der 'Count' auf dem Server oder dem Client läuft. Bei einem Btree+ indizierten Feld würde die Suche nach ein paar wenigen Zugriffen durchgeführt sein und höchstens die Indexdaten (für die Suche auf dem Client) über das Netzwerk transportiert werden.

Performant ist es aus meiner Sicht, wenn der SQL-Server genau ein Byte zurückgibt: 0 oder 1. Das heißt, im Idealfall läuft die Suche über den Index auf dem Server, da dort die Indexdaten i.d.R. sowieso im Cache stehen und die Suche mit "~Lichtgeschwindigkeit" erfolgt. In dem Fall würde netto nur 1 Byte (true oder false) übers Netz transportiert werden.

Somit ergeben sich 2 Fragen:
1. Wieviel Traffic löst der Count aus, wieviel die StoredProcedure?
2. Gibt es eine Möglichkeit zu messen, wieviel Traffic eine SQL-Abfrage tatsächlich auslöst?

grüße
ils


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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 by Thomas Breitkreuz