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 ».
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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 ».
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.
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 *************************
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" <brouardf@club-internet.fr> a écrit dans le message de news:
%235nIno9oFHA.572@TK2MSFTNGP15.phx.gbl...
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 *************************
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 *************************
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.
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.
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.