Constraints sind entworfen, um Unfälle beim Umgang mit Daten zu verhindern und die Integrität der Daten zu bewahren. In einigen Fällen kann es jedoch notwendig sein, Beschränkungen zu verschieben , so dass sie nicht wirklich durchsetzen ihre Regeln , bis eine bestimmte Bedingung erfüllt ist. Zum Beispiel ist es möglich, die Regeln einer Einschränkung verschieben, um nur aktivieren, wenn ein " commit " angefordert wurde. Anleitung
1
Erstellen Sie zwei Tabellen in SQLPlus zu deferrable Zwänge wie folgt nachweisen :
CREATE TABLE Test (
test_id INTEGER PRIMARY KEY,
foreign_id INTEGER NOT NULL);
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY, foreign2_id
INTEGER NOT NULL
);
< br > 2
ändern Sie die Tabellen in SQLPlus zu Fremdschlüsseleinschränkungen zueinander wie folgt hinzufügen :
ALTER TABLE Test Add Constraint test2REF
FOREIGN KEY ( foreign_ID ) LITERATUR test2 ( test2_ID )
INITIALLY DEFERRED DEFERRABLE ;
ALTER TABLE ADD CONSTRAINT test2 testref
FOREIGN KEY ( foreign2_ID ) LITERATUR Test ( test_ID )
INITIALLY DEFERRED DEFERRABLE ;
3
Legen Datensätze in beiden Tabellen in SQLPlus . Dies zeigt, dass mit einer deferrable Zwang Reihen trotz der Foreign Key Constraints hinzugefügt werden können :
INSERT INTO Test VALUES ( 1, 2) ;
INSERT INTO test2 VALUES ( 2 , 1);
4
Übernehmen Sie die Informationen auf der SQLPlus Befehl mit :
Commit ;
Dies wird den Vorgang abzuschließen und Zeilen in den beiden Tabellen hinzugefügt werden
5
Demonstrieren, wie es wäre , indem Sie alle Befehle wieder in einem einzigen Vorgang fehl , aber ohne die latente Einschränkung. Am SQLPlus Befehl eingeben :
- Erste Tropfen die Tische
Drop-Tabelle Test CASCADE Einschränkungen ;
Drop-Tabelle test2 CASCADE Einschränkungen ;
- . - geben Sie nun alle vorherigen Befehle , aber ohne die Zwänge deferrable wie folgt:
CREATE TABLE Test (
test_id INTEGER PRIMARY KEY,
foreign_id INTEGER NOT NULL
< p> );
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY, foreign2_id
INTEGER NOT NULL
);
ALTER TABLE test ADD CONSTRAINT test2REF
FOREIGN KEY ( foreign_id ) LITERATUR test2 ( test2_id );
ALTER TABLE ADD CONSTRAINT test2 testref
FOREIGN KEY ( foreign2_id ) LITERATUR Test ( test_id ) ;
INSERT INTO Test VALUES ( 1, 2) ;
INSERT INTO test2 VALUES ( 2 , 1);
Diese Version des Skripts wird scheitern , da die Zwänge nicht gestundet Erwartung einer " COMMIT "-Befehl.