Slt, je suis en train d'essayer de faire un héritage avec PostgreSQL mais je rencontre un problème.

Je crées un table "mère" Personnes (contenant id_personne + autres champs). Je fais hériter une table nommée adhérents et une autre nommée touristes.

je fais ensuite une table familles qui a une clé étrangère id_chef_famille référençant l'id d'un adhérent (et surtout pas d'un touriste). Seulement, l'id d’adhérent est celui de la table Personne. Il ne m'est pas possible de faire :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE TABLE Familles (
    id_famille integer NOT NULL,
    id_chef_famille integer NOT NULL,
    CONSTRAINT "Familles_pkey" PRIMARY KEY (id_famille),
    CONSTRAINT "Famille_to_Adherents_id_personne" FOREIGN KEY (id_chef_famille)
        REFERENCES Adherents(id_personne),
);
Je suis obligé de faire :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE TABLE Familles (
    id_famille integer NOT NULL,
    id_chef_famille integer NOT NULL,
    CONSTRAINT "Familles_pkey" PRIMARY KEY (id_famille),
    CONSTRAINT "Famille_to_Adherents_id_personne" FOREIGN KEY (id_chef_famille)
        REFERENCES Personnes(id_personne),
);
je me suis dit, ce n'est pas un problème il suffira d'ajouter un trigger qui vérifiera que l'id est bien l'id d'un adhérent mais pas d'un touriste.

J'ajoute donc mon adhérent :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
INSERT INTO adherents (id_personne, nom, prenom, date_naissance, num_licence, num_secu_sociale, statut)
  VALUES (1, 'Tavernier', 'Bertran', '1961-06-01', 111, 111111, 'Directeur');
Jusque là tout va bien mais lorsque j'ajoute la nouvelle famille :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
INSERT INTO familles (id_famille, id_chef_famille, code_postal, ville, pays, num_mobile, num_fixe, email, bateau1, bateau2)
  VALUES (1, 1, 31400, 'Toulouse', 'France', '0612345678', '0412345678', 'bigboss@gmail.com', 2, NULL);
Il me met une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
ERREUR:  une instruction insert ou update sur la table « familles » viole la contrainte de clé
étrangère « Famille_to_Adherents_id_personne »
DÉTAIL : La clé (id_chef_famille)=(1) n'est pas présente dans la table « personnes ».
Alors que quand je parcours mes tables, il y a bien mon adhérent d'id_personne = 1 dans personnes...

Comment résoudre le problème ?

J'ai essayé de mettre comme contrainte à Famille :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CONSTRAINT "Famille_to_Adherents_id_personne" FOREIGN KEY (id_chef_famille)
        REFERENCES Adherents(id_personne)
mais je reçois une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
ERREUR: il n'existe aucune contrainte unique correspondant aux clés données pour la
table « adherents » référencée
État SQL :42830
Merci d'avance.
Cordialement.