1. update employe
  set departement = 
    (select REF(d)
     from departement d
     where numDept = 10)
  where matricule = 125 
update employe
   set superieur =
     (select REF(e)
      from employe e
      where matricule = 200)
   where matricule = 125


En une fois :

update employe
set superieur =
(select REF(e)
from employe e
where matricule = 200),
departement =
(select REF(d)
from departement d
where numDept = 10)
where matricule = 125 2. update employe
set superieur = (select ref(e) from employe e where matricule = 200)
where departement = (select ref(d) from departement d where numdept = 10)
3. update employe
   set departement = 
     (select REF(d)
      from departement d
      where numDept = 85)
   where matricule = 200

Si on n'a pas mis de contrainte d'intégrité de référence, pas de message d'erreur mais aucun département n'est associé à l'employé, même si on ajoute ensuite un département de numéro 85. C'est normal car on a seulement dit que departement était de type departement_type, sans dire que departement référençait une ligne de la table departement.

Un moyen simple d'empêcher ça est d'ajouter une contrainte "not null" sur la colonne departement. En effet, le fait de donner un mauvais numéro pour numDept renvoie null pour la colonne departement :

alter table employe
   add (constraint nonnul_departement check(departement is not null));

Remarque : pour que cette contrainte soit acceptée il faut évidemment que tous les employés déjà entrés aient un département.

Pour que l'intégrité de référence marche aussi dans l'autre sens (des départements vers les employés) et qu'il ne soit pas possible de supprimer un département s'il contient des employés, ça ne suffit pas. Il faut en plus ajouter une contrainte de référence à la colonne departement de la table employe :

ALTER TABLE employe ADD(SCOPE FOR (departement) IS departement);

Mais ça ne marche que si la table employe est vide ! Il faut donc vider la table des employés et réinsérer les employés ensuite (après les avoir sauvées dans une autre table par exemple).

Ca ne suffit pas pour éviter les références "pendantes". Une contrainte "references" ajoute un contrôle supplémentaire :

alter table employe3
   add constraint ref_employe3_departement 
                  foreign key(departement) references departement;

Ensuite on ne pourra plus supprimer un département qui contient des employés. Essayez par exemple

delete from departement
where numdept = 10;