OVH Cloud OVH Cloud

Foreign Key sur plusieurs colonnes

3 réponses
Avatar
HervéR
Bonjour,

Soit une table T1 avec les champs
t1ch1, primary key
t1ch2, n'acceptant pas de valeur null
je voudrais ajouter dans la table T2 une clé étrangère portant sur deux
champs. Voici la syntaxe que j'ai essayée :
ALTER TABLE [dbo].[T2] ADD
CONSTRAINT [FK_macontrainte] FOREIGN KEY
(
[t2ch1], [t2ch2]
) REFERENCES [dbo].[T1] (
[t1ch1], [t1ch2]
)
Mais je reçois le message :
Serveur : Msg 1776, Niveau 16, État 1, Ligne 14
Aucune clé primaire ou prototype dans la table référencée 'dbo.T1' ne
correspond à la liste des colonnes de référence de la clé étrangère
'FK_macontrainte'.

J'imagine que ça marcherait si la primary key de T1 était composée avec les
2 champs. Mais cette solution ne plait pas.
Y'a-t-il une solution, notamment du côté de cette notion par moi inconnue de
« prototype ».

Merci d'avance.

3 réponses

Avatar
Fred BROUARD
par définition une référence d'intégrité ne peut porter que sur :
- une clef primaire (même composée de plusieurs colonnes)
- une contrainte d'unicité (même composée de plusieurs colonnes), c'est à dire
une clef candidate.

Il faut donc soit introduire dans la table référencée cette clef primaire, soit
englober les colonnes visées par une contrainte d'unicité.

POURQUOI ? il faut qu'à une référence le SGBDR ait l'absolue certitude de
l'unicité de cette référence. Cela n'est possible que pour des contraintes
PRIMARY KEY et UNIQUE.

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


HervéR a écrit:
Bonjour,

Soit une table T1 avec les champs
t1ch1, primary key
t1ch2, n'acceptant pas de valeur null
je voudrais ajouter dans la table T2 une clé étrangère portant sur deux
champs. Voici la syntaxe que j'ai essayée :
ALTER TABLE [dbo].[T2] ADD
CONSTRAINT [FK_macontrainte] FOREIGN KEY
(
[t2ch1], [t2ch2]
) REFERENCES [dbo].[T1] (
[t1ch1], [t1ch2]
)
Mais je reçois le message :
Serveur : Msg 1776, Niveau 16, État 1, Ligne 14
Aucune clé primaire ou prototype dans la table référencée 'dbo.T1' ne
correspond à la liste des colonnes de référence de la clé étrangère
'FK_macontrainte'.

J'imagine que ça marcherait si la primary key de T1 était composée avec les
2 champs. Mais cette solution ne plait pas.
Y'a-t-il une solution, notamment du côté de cette notion par moi inconnue de
« prototype ».

Merci d'avance.




Avatar
HervéR
Merci de ta réponse !
Ça fonctionne très bien dans une base vierge où j'ai créé les mêmes deux
tables.
Mais j'ai un problème dans la "vraie" base, sans doute à cause d'une autre
contrainte...
J'analyse tout ça puis j'avise !
Merci encore.


"Fred BROUARD" a écrit dans le message de news:
%
par définition une référence d'intégrité ne peut porter que sur :
- une clef primaire (même composée de plusieurs colonnes)
- une contrainte d'unicité (même composée de plusieurs colonnes), c'est à
dire une clef candidate.

Il faut donc soit introduire dans la table référencée cette clef primaire,
soit englober les colonnes visées par une contrainte d'unicité.

POURQUOI ? il faut qu'à une référence le SGBDR ait l'absolue certitude de
l'unicité de cette référence. Cela n'est possible que pour des contraintes
PRIMARY KEY et UNIQUE.

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Avatar
HervéR
Ayé !
Ça fonctionne impec' dans ma vraie base. Le problème venait de ce qu'un
enregistrement violait la contrainte que je voulais mettre en place :)
Je l'ai supprimé et ça baigne !
(Eviter les mots qui rappellent les vacances, éviter les mots qui rappellent
les vacances, éviter ... ;-)
Merci encore à toi.