Q: Devo disabilitare i vincoli per l'inserimento?
A: In Oracle, no, non se i vincoli di chiave esterna sono DEFERRABLE
(vedi esempio qui sotto)
Per Oracle:
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO Departments values ('foo','dummy');
INSERT INTO Employees values ('bar','foo');
UPDATE Departments SET EmployeeID = 'bar' WHERE DepartmentID = 'foo';
COMMIT;
Diamo disfare che:
- (l'autocommit deve essere disattivato)
- posticipare l'applicazione del vincolo di chiave esterna
- inserire una riga alla tabella Department con un valore "fittizio" per la colonna FK
- inserire una riga di tabella Impiegato con FK riferimento alle attrezzature
- sostituire valore "fittizio" in attrezzature FK con riferimento reale
- ri-abilitare l'applicazione dei vincoli
NOTE: disattivazione di un vincolo di chiave esterna ha effetto per tutte le sessioni, rinviando un vincolo è a un livello di transazione (come nell'esempio), o al livello di sessione (ALTER SESSION SET CONSTRAINTS=DEFERRED;
)
Oracle ha consentito che i vincoli di chiave esterna siano definiti DEFERIBILI per almeno un decennio. Definisco tutti i vincoli di chiave estera (naturalmente) da DEFERRABLE INIZIALMENTE IMMEDIATO. Ciò mantiene il comportamento predefinito come tutti si aspettano, ma consente la manipolazione senza che le chiavi esterne siano disabilitate.
vedere AskTom:
http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html
vedere AskTom: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10954765239682
vedi anche: http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_12.shtml
[EDIT]
A: In Microsoft SQL Server, non è possibile rimanda i vincoli delle chiavi esterne come puoi in Oracle. Disabilitare e riattivare il vincolo di chiave esterna è un approccio, ma rabbrividisco alla prospettiva di 1) impatto sulle prestazioni (il vincolo di chiave esterna viene controllato per la tabella INTERA quando il vincolo è riattivato), 2) gestendo l'eccezione se (quando?) la riattivazione del vincolo fallisce. Si noti che la disattivazione del vincolo influirà su tutte le sessioni, quindi, mentre il vincolo è disabilitato, altre sessioni potrebbero potenzialmente inserire e aggiornare le righe, il che causerà il fallimento della restrizione del vincolo.
Con SQL Server, un approccio migliore consiste nel rimuovere il vincolo NOT NULL e consentire un NULL come segnaposto temporaneo mentre le righe vengono inserite/aggiornate.
Per SQL Server:
-- (with NOT NULL constraint removed from Departments.EmployeeID)
insert into Departments values ('foo',NULL)
go
insert into Employees values ('bar','foo')
go
update Departments set EmployeeID = 'bar' where DepartmentID = 'foo'
go
[/ EDIT]
Questo mi sembra uno strano schema per me, si può spiegare il motivo per cui si hanno le relazioni in questo modo? – Bob
È EmployeeId nella tua tabella di dipartimento come un responsabile di reparto o qualcosa del genere? –
In Oracle, il "trucco" è definire le chiavi esterne DEFERRABLE. – spencer7593