Oracle appelle cela une contrainte d'intégrité auto-référentielle. La documentation est ici pour une description,
Vous créez une contrainte auto-référentielle de la même manière que vous le feriez pour une contrainte normale :
alter table employees
add constraint employees_emp_man_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
;
Je suppose que votre manager_no
est nullable. J'ai ajouté set null ici en tant que delete cascade
effacerait probablement une grande partie de votre table.
Je ne peux pas penser à une meilleure façon de faire cela. La suppression d'un responsable ne doit pas entraîner la suppression de tous ses employés, vous devez donc set null
et ayez un déclencheur sur la table pour vous alerter de toute personne sans gestionnaire.
J'aime toujours ce site, qui est bon pour les références simples. et n'oubliez pas d'avoir un index sur le FK également ou Tom vous criera dessus :-).
On peut également utiliser la syntaxe Oracle standard pour créer un FK auto-référentiel dans l'instruction de création de table, qui ressemblerait à ce qui suit.
create table employees
( emp_id number
, other_columns ...
, manager_no number
, constraint employees_pk
primary key (emp_id)
, constraint employees_man_emp_fk
foreign key ( manager_no )
references employees ( emp_id )
on delete set null
);
MODIF :
En réponse au commentaire de @popstack ci-dessous :
Bien que vous puissiez le faire en une seule instruction, ne pas pouvoir modifier une table est une situation assez ridicule. Vous devez absolument analyser une table à partir de laquelle vous allez sélectionner et vous voudrez toujours un index sur la clé étrangère (et éventuellement plus de colonnes et/ou plus d'index), sinon chaque fois que vous utiliserez la clé étrangère, vous allez faire une analyse complète de la table. Voir mon lien vers asktom ci-dessus.
Si vous ne parvenez pas à modifier un tableau, vous devez le faire, par ordre décroissant d'importance.
- Découvrez comment vous pouvez.
- Modifier la conception de votre base de données car un FK doit avoir un index et si vous ne pouvez pas en avoir un, les FK ne sont probablement pas la solution. Peut-être avoir une table des managers et une table des employés ?