![]() |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Du sagst prizipiell in etwas krasserer Form das, was ich weiter oben meinte :-)
Zitat:
Zitat:
|
AW: Firebird Feld mit foreign key "0" anstelle von NULL
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. |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
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. |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Ein Foreign Key ist technisch nichts anderes als ein Systemtrigger und ein Systemindex.
Es spricht nichts dagegen, den Trigger so umzusetzen, das der deiner Logik entspricht und zum Beispiel mit einer Exception das Löschen verhindert
Code:
das ist kein konkreter Vorschlag für deine Problematik, das so mit coalesce zu lösen, sondern
CREATE OR ALTER TRIGGER CUSTOMER_BD0 FOR CUSTOMER
ACTIVE BEFORE DELETE POSITION 0 AS begin if (exists (select orders.customer_id from orders where coalesce(orders.customer_id,0)=old.id)) then exception err 'Customer kann nicht gelöscht werden, wenn noch noch Orders existieren'; end einfach nur ein Hinweis, das fehlende Logik in Foreign keys problemlos selbst gebaut werden kann. Wenn hier im Beispiel kein Index auf orders.customer_id existieren würde, bricht die Performance ein und jeder delete auf customer würde ein Full table scan auf orders auslösen. Daher sollte man drauf achten, das da ein Index existiert. Die Deklaration eines Foreign Keys legt Trigger und Index automatisch an, wenn es also dir so nicht passt, wie es deklarativ geht, do it yourself. |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Danke erstmal für eure Antworten.
Generell ist es schon machbar die 0 Werte in NULL Werte zu ändern, der Aufwand wäre nur zeitlich sehr groß da es doch ziemlich viele Felder betrifft, weswegen ich wissen wollte ob ich noch andere (weniger aufwändige) Möglichkeiten habe. Diese Frage scheint damit beantwortet zu sein :) |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Dennoch könnte man sich jetzt überlegen das zu ändern,
denn wer weiß wieviele hundert Felder die nächsten Jahre noch dazu kommen, und dann wird es immer schwerer zu ändern. |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Zitat:
Man kann mit SQL sowohl horizontal als auch vertikal ganz viele Felder "auf einen Schlag" aktualisieren. Bei einem verteilten System müsste das durch eine Aktualisierung, einen Remote Support o.ä. erfolgen. Ansonsten sehe ich es wie himitsu und würde nicht unbedingt die technischen Möglichkeiten in der Richtung ausreizen und eine bereits unkonventionelle Umsetzung noch weiter verändern. |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Zitat:
Aber scheint als ob ich da wohl nicht drum rum komme... |
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Einfach SP oder VIEW, der das gewünschte Format liefert.
|
AW: Firebird Feld mit foreign key "0" anstelle von NULL
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 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-2025 by Thomas Breitkreuz