AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensatz suchen, mit SQL Integrität prüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Datensatz suchen, mit SQL Integrität prüfen

Ein Thema von ils566 · begonnen am 22. Apr 2006 · letzter Beitrag vom 23. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
ils566

Registriert seit: 3. Dez 2005
28 Beiträge
 
#1

Datensatz suchen, mit SQL Integrität prüfen

  Alt 22. Apr 2006, 23:13
Datenbank: mysql • Version: 5 • Zugriff über: mydac
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 22. Apr 2006, 23:17
z.B. select count(PersonaID) as anz from <tabelle> where PersonaID1=1;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 22. Apr 2006, 23:18
Deine Frage hat nix mit Integritätsprüfung zu tun... Aber um einen Datensatz auf Existenz zu prüfen, mach ich immer so:

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
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.
  Mit Zitat antworten Zitat
ils566

Registriert seit: 3. Dez 2005
28 Beiträge
 
#4

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

  Alt 22. Apr 2006, 23:39
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 22. Apr 2006, 23:43
Wenn die datenbank es unterstützt, direkt in den Metdaten. (foreign key Definition), LookUp-Komponenten oder wie oben ausgeführt durch Abfrage.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

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

  Alt 23. Apr 2006, 01:50
Was hat da ein Count drin zu suchen ?

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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 23. Apr 2006, 07:44
[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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

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

  Alt 23. Apr 2006, 10:48
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 von Jelly:
2. Was, wenn mehrere Datensätze mit der gesuchten ID existieren. Dann gibts wohl ne Exception
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 von Jelly:
select count(id) as N from Tabelle where id = 123
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. 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:
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

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

  Alt 23. Apr 2006, 15:55
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. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#10

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

  Alt 23. Apr 2006, 17:26
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
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