Vincoli sono progettati per prevenire incidenti nel trattamento delle informazioni e per preservare l'integrità dei dati . In alcuni casi, tuttavia , può essere necessario rinviare vincoli quindi in realtà non rispettare le loro regole finché una determinata condizione . Ad esempio , è possibile rinviare le regole di un vincolo di attivare solo se è stato richiesto un "commit" . Istruzioni
1
Creare due tabelle in sqlplus per dimostrare vincoli differibili come segue :
CREATE TABLE test (
test_id INTEGER PRIMARY KEY , Stati
foreign_id INTEGER NOT NULL) ;
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY , Stati
foreign2_id INTEGER NOT NULL
) ;
< br > 2
Modificare i tavoli in sqlplus per aggiungere vincoli di chiave esterna tra loro come segue :
ALTER TABLE test aggiungi vincolo test2REF
FOREIGN KEY ( foreign_ID ) RIFERIMENTI test2 ( test2_ID )
INIZIALMENTE DIFFERITA DEFERRABLE ;
ALTER TABLE ADD CONSTRAINT test2 testREF
FOREIGN KEY ( foreign2_ID ) RIFERIMENTI prova ( test_ID ) per
INIZIALMENTE DIFFERITA DEFERRABLE ;
3
inserire record in entrambe le tabelle in SQLPlus . Questo dimostra che con un vincolo differibile , le righe possono essere aggiunte , nonostante i vincoli di chiave esterna :
INSERT INTO test VALUES ( 1 , 2) ;
INSERT INTO test2 VALUES ( 2 , 1 ) ;
4
commettere l' informazione al comando sqlplus con :
Commit ;
Questo completerà l'operazione e le righe sarà aggiunto per entrambe le tabelle < br . >
5
Dimostrare come fallirebbe eseguendo tutti i comandi di nuovo in una singola operazione , ma senza il vincolo differito . Al comando sqlplus entrare :
- prima eliminare le tabelle
DROP TABLE vincoli CASCADE prova;
tavolo Goccia test2 vincoli CASCADE ;
- . - inserire ora tutti i comandi precedenti, ma senza i vincoli differibili come segue :
CREATE TABLE test (
test_id INTEGER PRIMARY KEY , Stati
foreign_id INTEGER NOT NULL
< p > ) ;
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY , Stati
foreign2_id INTEGER NOT NULL
) ;
ALTER TABLE test Aggiungi vincolo test2REF
FOREIGN KEY ( foreign_id ) RIFERIMENTI test2 ( test2_id ) ;
ALTER TABLE ADD CONSTRAINT test2 testREF
FOREIGN KEY ( foreign2_id ) prova RIFERIMENTI ( test_id ) ;
INSERT INTO test VALUES ( 1 , 2) ;
INSERT INTO test2 VALUES ( 2 , 1 ) ;
Questa versione dello script fallirà come i vincoli hanno non è stata rinviata in attesa di un comando "commit" .