Q: Dois-je désactiver les contraintes pour que l'insertion se produise?
A: Dans Oracle, non, pas si les clés étrangères sont DEFERRABLE
(voir exemple ci-dessous)
Pour 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;
Let Déballons que:
- (la validation automatique doit être désactivée)
- différer l'application de la contrainte de clé étrangère
- insérer une ligne à la table Département avec une valeur « factice » pour la colonne FK
- insérer une ligne à la table des employés FK référence au Département
- remplacer la valeur « factice » dans le département FK en référence réelle
- Réactivez l'application des contraintes
REMARQUES: la désactivation d'une contrainte de clé étrangère prend effet pour toutes les sessions, Retarder une contrainte est à un niveau de transaction (comme dans l'exemple), ou au niveau de la session (ALTER SESSION SET CONSTRAINTS=DEFERRED;
)
Oracle a permis que les contraintes de clé étrangère soient définies comme DEFERRABLE pendant au moins une décennie. Je définis toutes les contraintes de la clé étrangère (naturellement) pour être DEFERRABLE INITIALEMENT IMMEDIATE. Cela conserve le comportement par défaut attendu par tout le monde, mais permet une manipulation sans que les clés étrangères ne soient désactivées.
voir AskTom:
http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html
voir AskTom: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10954765239682
voir aussi: http://www.idevelopment.info/data/Oracle/DBA_tips/Database_Administration/DBA_12.shtml
[EDIT]
A: Dans Microsoft SQL Server, vous ne pouvez pas différer les contraintes de clés étrangères comme vous le pouvez dans Oracle. Désactiver et réactiver la contrainte de clé étrangère est une approche, mais je frémis à la perspective de 1) l'impact sur les performances (la contrainte de clé étrangère étant vérifiée pour la table ENTIRE lorsque la contrainte est réactivée), 2) la gestion de l'exception (quand?) la réactivation de la contrainte échoue. Notez que la désactivation de la contrainte affectera toutes les sessions, donc tant que la contrainte est désactivée, d'autres sessions pourraient potentiellement insérer et mettre à jour des lignes qui provoqueront l'échec de la réouverture de la contrainte. Avec SQL Server, une meilleure approche consiste à supprimer la contrainte NOT NULL et à autoriser une valeur NULL comme espace réservé temporaire lorsque des lignes sont insérées/mises à jour.
Pour 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]
Cela semble un schéma étrange pour moi, pouvez-vous expliquer pourquoi vous avez les relations de cette façon? – Bob
Est-ce que EmployeeId dans votre département table comme un directeur de département ou quelque chose? –
Dans Oracle, le "truc" est de définir la clé étrangère (s) DEFERRABLE. – spencer7593