AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Fehlerhaften ForeinKey finden

Fehlerhaften ForeinKey finden

Ein Thema von Perlsau · begonnen am 29. Aug 2015 · letzter Beitrag vom 31. Aug 2015
Antwort Antwort
Seite 1 von 3  1 23   
Perlsau
(Gast)

n/a Beiträge
 
#1

Fehlerhaften ForeinKey finden

  Alt 29. Aug 2015, 15:28
Datenbank: Firebird • Version: 2.5 • Zugriff über: IbDac
Moin allerseits,

in einer DB gibt es eine Tabelle ADRESSEN, die eine Spalte ORT_ID enthält, welche auf die Tabelle ORTE verweist, in der Orte, Postleitzahlen und Vorwahlen eingetragen werden. Die Spalte ORT_ID ist jedoch nicht als Foreign-Key deklariert, die entsprechende Zuweisung erfolgt erst im zugehörigen View.

Nun habe ich festgestellt, daß in View_ADRESSEN genau eine Adresse weniger angezeigt wird als in der Tabelle ADRESSEN. Wie das zustandekam, konnte ich mir leicht erklären, denn ich habe gestern den halben Tag damit verbracht, die Tabelle ORTE zu bereinigen, weil dort etliche Orte quasi doppelt vorhanden waren: gleiche Postleitzahl mit anderer Schreibweise des Ortes (z.B. München-Schwabing und München mit derselben PLZ). Ich habe also irgendwo vergessen, einer Adresse die verbliebene ORT_ID zuzuweisen (z.B. München-Schwabing gelöscht, aber die Adresse mit dieser ORT_ID nicht geändert), so daß diese eine Adresse nun eine ORT_ID aufweist, die in der Tabelle ORTE nicht mehr existiert. Wie finde ich diesen Record heraus, ohne händisch alle Tabellen durchgehen zu müssen?

Besten Dank für euer Interesse.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
662 Beiträge
 
#2

AW: Fehlerhaften ForeinKey finden

  Alt 29. Aug 2015, 15:37
Code:
select * from ADRESSEN where ORT_ID not in (select ORT_ID from ORTE)
(falls ich dein Problem richtig verstanden habe)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.989 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehlerhaften ForeinKey finden

  Alt 29. Aug 2015, 15:38
Oder so:
Code:
select * 
from adressen a
left join orte b
on a.ort_id = b.<???>
where b.<???> is null
Heißt das ID-Feld in Orte auch ORT_ID?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.989 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehlerhaften ForeinKey finden

  Alt 29. Aug 2015, 15:40
Für's nächste mal:
Miniaturansicht angehängter Grafiken
visual_sql_joins.jpg  
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Fehlerhaften ForeinKey finden

  Alt 29. Aug 2015, 15:51
Code:
select * from ADRESSEN where ORT_ID not in (select ORT_ID from ORTE)
(falls ich dein Problem richtig verstanden habe)
Du hast mein Problem vollkommen richtig verstanden und die perfekte Lösung dafür präsentiert.
Ich konnte den fehlerhaften Record finden und korrigieren.
Nun werden in der Originaltabelle genau so viele Records angezeigt wir im View. Herzlichen Dank dafür

Oder so:
Code:
select * 
from adressen a
left join orte b
on a.ort_id = b.<???>
where b.<???> is null
Dank auch dir
Die Version von Olli empfinde ich jedoch als handlicher, weil sie kürzer ist (und nicht, weil sie früher da war).

Heißt das ID-Feld in Orte auch ORT_ID?
Nein, ich habe Phantasie-Bezeichner gewählt, um das Problem so anschaulich wie möglich darzustellen: Tabellen und Spalten lauten bei mir anders. Dennoch war ich in der Lage, die gepostete Lösung erfolgreich auf mein Problem anzuwenden. Ich gehe sogar davon aus, daß ich diese Lösung auch in zukünftig auftretenden ähnlichen Fällen anzuwenden in der Lage sein werde. Aber dennoch danke für deine fürsorgliche Nachfrage

Für's nächste mal:
Danke auch dafür, das kann ich gut gebrauchen.
Hab's mir gleich runtergeladen, ausgedruckt und an die Wand gepinnt.

Geändert von Perlsau (29. Aug 2015 um 15:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Fehlerhaften ForeinKey finden

  Alt 30. Aug 2015, 09:37
Die "not in" Lösung stoßt aber eher an die Grenzen der DB (Begrenzung der Menge), darum wäre die Lösung von Uwe zu bevorzugen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Fehlerhaften ForeinKey finden

  Alt 30. Aug 2015, 10:08
Die "not in" Lösung stoßt aber eher an die Grenzen der DB (Begrenzung der Menge), darum wäre die Lösung von Uwe zu bevorzugen.
Versteh ich jetzt nicht: welche Grenzen? Ich hab da ungefähr 2500 Datensätze in der Adresstabelle und ca. 1400 in der Orttabelle. Erstere wird allerhöchstens 50.000 Datensätze haben (mehr gibt's in dieser Branche nicht in DE), letztere vielleicht ... keine Ahnung, aber keine 20.000 schätze ich mal ... Schließlich hab ich das bis jetzt nur einmal benötigt, um in IbExpert im SQL-Editor den fehlerhaften Record zu finden. Das ging so schnell, ich hatte kaum Zeit zum Blinzeln
Also warum sollte ich mir da jetzt tiefere und noch weiter tiefergehende Gedanken machen müssen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: Fehlerhaften ForeinKey finden

  Alt 30. Aug 2015, 11:38
Die "not in" Lösung stoßt aber eher an die Grenzen der DB (Begrenzung der Menge), darum wäre die Lösung von Uwe zu bevorzugen.
Versteh ich jetzt nicht: welche Grenzen?
Versteh es einfach als freundlichen Hinweis bzw. Warnung. Wie Deine konkrete Datensituation in Zahlen aussieht, kann ja niemand vorher wissen. Die Grenzen sind wie immer DB und Versionsabhängig.
Auf die Schnelle hab ich zu Firebird nichts konkretes außer diesem Post gefunden:
https://groups.yahoo.com/neo/groups/...s/topics/95414

Dabei ist nicht klar, ob die Limitierung nur für explizite Aufzählung oder auch für dynamische Selectrückgaben erfolgt.

Meine Verständnis ist:
(not) in .. für kleineren Abgleich (also adhoc, kleine Komfortabfragen)
table join .. für unlimitierten Massenabgleich (also für den Rest)

Wenn Du es genau für Deine Version wissen willst, musst Du wohl selbst danach suchen oder es ausprobieren.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Fehlerhaften ForeinKey finden

  Alt 30. Aug 2015, 12:12
Da rächt sich die Ansicht, dass man man aus Zeit-/Kostengründen beim Datenbankdesign auf die Deklaration der Constraints VWzüchten kann, da man diese ja im Programm berücksichtigt.
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: Fehlerhaften ForeinKey finden

  Alt 30. Aug 2015, 12:21
Bitte nicht mit Handy von Unterwegs auf der Autobahn posten, schon gar nicht, wenn es ein VW ist. Da geht nicht nur die Worterkennung schnell mal schief.


Da rächt sich die Ansicht..
Naja, das wäre eigentlich die Hauptbotschaft des Threads, der sich originär um die Beseitigung der Folgen dreht!
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:40 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