AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Feld mit foreign key "0" anstelle von NULL
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Feld mit foreign key "0" anstelle von NULL

Ein Thema von Emwykey · begonnen am 30. Jul 2018 · letzter Beitrag vom 1. Aug 2018
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 17:44
Hallo,
das alles klappt aber nur (NullIf), wenn die Tabelle erzeugt wird.

Warum bereinigst Du deine Tabelle nicht vor dem Erzeugen des FK
Update Table Set FKFeld=Null Where FKFeld=0
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.314 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 18:01
das alles klappt aber nur, wenn die Tabelle erzeugt wird.
Wenn der Index erzeugt (oder geändert) wird oder wenn nachfolgen Datensätze angelegt/geändert werden.

Wie gesagt, was und wie Firebird genau kann, weiß ich auch nicht, aber hier mal ein Beispiel aus PostgreSQL.
CREATE UNIQUE INDEX co_data_index ON component_options (co_item, COALESCE(co_minr, -2), COALESCE(LOWER(co_name), ''));
Aber viele andere DBMS können ebenfalls mit Funktionen in den Definitionen von Indize und Constraints umgehen und da denke ich mir, dass Firebird hier keine Ausnahme sein wird.


Aber deswegen auch zuerst der Vorschlag die Daten zu bereinigen, weil das bestimmt einfacher/besser sein wird.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Jul 2018 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.552 Beiträge
 
Delphi 7 Professional
 
#3

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 18:11
Einzige Krücke, die mir da so einfällt:

Mastersatz mit der ID 0 anlegen und kenntlichmachen, dokumentieren, dass dies die Referenz für die Sätze ist, für die es keine Referenz gibt und diesen vor dem Löschen (ggfls. auch Ändern) schützen, da ansonsten ggfls. mit ihm zusammen alle (eigentlich) nicht referenzierten Daten aus der Datenbank entfernt werden (was ja per Constrains durchaus umsetzbar ist).

Wenn Du dem Vorschlag die ID 0 auf Null zu setzen nicht folgen kannst, weil z. B. andere Nutzer / andere Software bei fehlender Referenz den Wert 0 für die ID vergeben und Du keine andere Lösung findest, das Problem per Constrains ... zu lösen, scheint das (erstmal) die einzig praktikable Lösung.

Prinzipiell sollte man sich aber nochmal grundlegende Gedanken über das vorhandenen Design der Datenbank und / oder der sie benutzenden Software machen. Ansonsten besteht die Gefahr, dass man bei mehr oder weniger dokumentierten oder undokumentierten Krücken zur Problembehebung bleibt.

Und sowas geht irgendwann schief, Murphy ist da geduldig und schlägt irgendwann gnadenlos zu
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 18:26
Ggf. anderes Programm per Trigger / View befriedigen.

Insert 0 -> NULL, Abfrage NULL -> 0.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 18:41
Hab ich was verpasst oder würde ein einfaches
Code:
UPDATE
  tabelle
SET
  fk_feld = null
WHERE fk_feld = 0
nicht das Problem lösen?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.552 Beiträge
 
Delphi 7 Professional
 
#6

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 19:55
Wenn irgend ein Programm beim Einfügen neuer, nicht referenzierter, Sätze wieder 'ne 0 für die ID vergibt, wäre das nur 'ne Momentlösung. Und wenn es dann mit ID = Null nicht zurecht kommt, eher kontraproduktiv.

Das
Zitat von Emwykey:
- warum sei jetzt mal dahin gestellt.
aus der Threaderöffnung ist genau der Grund, weshalb man keine definitiv funktionierende Lösung vorschlagen kann.

Also benötigen wir erstmal eine Erklärung des Warum, um dann daraus eventuell eine Lösung, besteht aus einer Kombination der bisherigen Vorschläge (Update, Trigger, View, Constraint ...), entwerfen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 20:23
Naja gut, dass man jegliche Trigger/Prozeduren und Programmcode dementsprechend ändern musst ist klar.
Ich meine um ehrlich zu sein gibt es keine andere ordentliche Lösung als das UPDATE + Codeänderungen (0 => null)
Alles andere wäre nur ein Workaround den man früher oder später eh wieder bereut.
Anders ist es ggf. weniger Arbeit aber man verarscht sich nur selbst.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.552 Beiträge
 
Delphi 7 Professional
 
#8

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 20:30
Du sagst prizipiell in etwas krasserer Form das, was ich weiter oben meinte
Zitat:
verarscht
ist quasi der Klartext für:
Zitat:
Und sowas geht irgendwann schief, Murphy ist da geduldig und schlägt irgendwann gnadenlos zu
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 21:38
Also wenn ich #1 richtig verstanden habe, gibt es Detail-Datensätze ohne Verbindung zum Haupt-Datensatz, was ja eher suboptimal ist. Da sollte wohl mal massiv aufgeräumt werden.

Gruß
K-H

P.s
Fehler machen wir alle, aber diese zukleistern ist nur wenig schlechter als Garnichts zu tun.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

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

AW: Firebird Feld mit foreign key "0" anstelle von NULL

  Alt 30. Jul 2018, 22:33
Wenn Du nicht willst, dass der Datensatz gelöscht wird, lege ein Feld an, dass diesen Status (und vielleicht andere Lifecycle Zustände des Datensatz definiert) und nutze einen Trigger, der das überwacht.

Die Referenz auf eine andere Tabelle dafür zu verwenden, ist besonders in Deinem Fall nicht möglich, außer Du legst eben den Datensatz mit Key 0 in der Fremdtabelle an.

Funktionsbasierte Indices würde ich für den Zweck auch nicht einsetzen- selbst wenn es ginge, was ich bezweifele- weil ein Index nichts mit dem Modell zu tun haben sollte.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:51 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