Oracle
 sql >> Base de données >  >> RDS >> Oracle

Appliquer une contrainte de clé étrangère aux colonnes de la même table

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.

  1. Découvrez comment vous pouvez.
  2. 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 ?