Delphi-PRAXiS
Seite 1 von 2  1 2      

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 22: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 22: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 22: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 22: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 22: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 00: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 06: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 09: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 14: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 16: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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz