Was sind Nachteile und Vorteile für die Definition einer Beschränkung aufschiebbar

Wir verwenden die Oracle-database in unseren Projekten. Und wir definieren so viel wie Einschränkungen, die auf die database angewendet werden können (einschließlich Primär-, Unique-, Check- und Fremdschlüssel-Constraints).

Es scheint, dass die Definition von Constraints DEFERRABLE es uns erlaubt, sie zu vercasting, wenn sie benötigt wird. Warum also sollte eine Constraint als NICHT ABWEICHEND definiert werden?

Warum databaseen wie Oracle nicht als Standardfall DEFERRABLE?

Gibt es irgendwelche Vorteile für die Definition eines Constraint NOT DEFERRABLE?

Der Hauptanwendungsfall für aufschiebbare Einschränkungen besteht darin, dass Sie sich keine Gedanken über die Reihenfolge machen müssen, in der Sie DML-statementen für mehrere Tabellen ausführen, die eine Fremdschlüsselbeziehung aufweisen.

Betrachten Sie das folgende Beispiel:

create table parent ( id integer not null primary key ); create table child ( id integer not null primary key, parent_id integer not null references parent ); create table grand_child ( id integer not null primary key, child_id integer not null references child ); 

Wenn die Einschränkungen unmittelbar sind, müssen Sie Zeilen (die sich gegenseitig referenzieren) in der richtigen Reihenfolge insert (oder löschen), was z. B. ein Problem beim Massenladen von data sein kann. Wenn die Einschränkungen aufgeschoben werden, können Sie die Zeilen in beliebiger Reihenfolge insert / löschen, solange alles in Ordnung ist, wenn Sie Ihre Transaktion festschreiben.

Mit einer aufschiebbaren Einschränkung (die das obige Beispiel nicht erzeugt!) Könntest du folgendes tun:

 insert into grand_child values (1,1); insert into child values (1,1); insert into parent values (1); commit; 

Das wäre nicht möglich, wenn die Einschränkungen unmittelbar wären.

Ein Sonderfall des obigen Beispiels sind zyklische referenceen:

 create table one ( id integer not null primary key, id_two integer not null ); create table two ( id integer not null primary key id_one integer not null ); alter table one add constraint fk_one_two (id_two) references two(id); alter table two add constraint fk_two_one (id_one) references one(id); 

Ohne die Einschränkungen als aufschiebbar zu deklarieren, können Sie keine data in diese Tabellen insert.

Die Problemumgehung für DBMS, die aufschiebbare Einschränkungen nicht unterstützen, besteht darin, die fk-Spalten auf Nullwerte zu setzen. Und dann fügen Sie zuerst Nullwerte ein:

Einfügen in einen Wert (1, null); Einfügen in zwei Werte (1, 1); Aktualisiere einen Satz id_two = 1 wo id = 1;

Mit einer aufschiebbaren Einschränkung benötigen Sie die zusätzliche update-statement nicht.

(Das Design mit zyklischer reference ist jedoch oft fraglich!)

Ich verwende nicht oft schiebbare Einschränkungen, aber ich möchte nicht ohne sie leben.

Ein Nachteil von aufschiebbaren Beschränkungen ist jedoch die Fehlerprüfung. Sie wissen es erst commit wenn Sie sich commit dass Ihre data korrekt sind. Das macht es etwas komplizierter herauszufinden, was schief gelaufen ist. Wenn Sie den Fehler beim insert (oder delete oder update ) erhalten, wissen Sie sofort, welche Werte den Fehler verursacht haben.