web-dev-qa-db-fra.com

SQL Server 2008: les colonnes de la table ne correspondent pas à une clé primaire existante ni à une contrainte unique

Je dois apporter des modifications à une base de données SQL Server 2008. 

Cela nécessite la création d'une nouvelle table et l'insertion d'une clé étrangère dans la nouvelle table qui référence la clé primaire d'une table existante. Je souhaite donc établir une relation entre mon nouveau tblTwo, qui fait référence à la clé primaire de tblOne. 

Cependant, lorsque j'ai essayé de le faire (via SQL Server Management Studio), j'ai eu l'erreur suivante:

Les colonnes de la table 'tblOne' n'en ont pas faire correspondre une clé primaire existante ou Contrainte unique

Je ne suis pas vraiment sûr de ce que cela signifie, et je me demandais s'il y avait un moyen de le contourner?

48
109221793

Cela signifie que la clé primaire dans tblOne n'a pas été correctement déclarée - vous devez accéder à tblOne et y ajouter la contrainte PRIMARY KEY.

Si vous êtes sûr que tblOne a une contrainte PRIMARY KEY, il existe peut-être plusieurs tables tblOne dans votre base de données, appartenant à différents schémas, et votre clause references dans votre contrainte FK sélectionne la mauvaise.

S'il existe une clé composite (ce que votre commentaire indiquerait), vous devez également inclure les deux colonnes dans votre référence de clé étrangère. Notez qu'une table ne peut pas avoir plusieurs clés primaires - mais si elle a une clé composite, vous verrez un symbole de clé à côté de chaque colonne faisant partie de la clé primaire.

73

Si vous avez une clé composite, l'ordre est important lors de la création d'un FK, et parfois l'ordre n'est pas comme il est affiché. 

Ce que je fais est d'aller à la section Keys de la table1 et sélectionnez la clé primaire du script comme créer dans le presse-papiers, puis créer FK en utilisant l'ordre indiqué dans le script

51
alanh

Si vous obtenez toujours cette erreur après avoir suivi tous les conseils donnés dans les réponses ci-dessus, tout se passe bien.

Une façon de résoudre ce problème consiste à supprimer vos clés primaires pour les deux tables, à enregistrer, à actualiser, puis à les rajouter ..____, puis essayez à nouveau d'ajouter votre relation.

5
Ruan

J'ai eu cette situation qui m'a amené à ce sujet. Même erreur mais une autre cause. Cela aidera peut-être quelqu'un.

Table1
ColA (PK)
ColB (PK)
ColC


Table2
ID (PK)
ColA
COLB

En essayant de créer une clé étrangère dans Table2, j'ai choisi les valeurs de la liste déroulante dans l'ordre inverse

Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA

Cela me jetait une erreur comme dans le nom du sujet. Création de FK en conservant l'ordre des colonnes dans la table de clés primaires telles qu'elles sont, l'erreur disparaît.

Stupide, mais .. :)

4
100r

Cette question m'a surpris, j'ajoutais la relation sur la mauvaise table. Donc, si vous essayez d'ajouter une relation dans la table A à la table B, essayez d'ajouter la relation dans la table B à la table A.

2

Cette erreur est arrivée avec moi When J'ai essayé de add foreign key contrainte à partir de PrimaryKey Table

Simpy aller à autre table et et create this foreign key contrainte from il (foreign key Table)

2
Basheer AL-MOMANI

J'ai trouvé que les noms de colonne doivent correspondre.

Exemple: Ainsi, si tblOne a un id appelé categoryId, une référence dans tblTwo doit également être appelée categoryId.

_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"

J'ai remarqué cela en essayant de créer une clé étrangère entre 2 tables portant le nom de colonne "id" comme clé primaire.

0
Per G

Si vous avez des données dans vos tables, cela pourrait être le problème.

Dans mon cas, certaines données se trouvaient dans la table Account que j’avais chargée à 15 heures et certaines dans la table Contact que j’avais chargée à 15 h 10, de sorte que la table Contact avait des valeurs qui ne figuraient pas encore dans ma table Account.

J'ai fini par supprimer ces valeurs de la table des contacts, puis j'ai réussi à ajouter une clé sans aucun problème. 

0
Pete Kozak

Si rien n'y fait, alors cela pourrait être la raison: Colonne 4

Tableau B: Colonne a (clé primaire) Colonne b Colonne c

lorsque vous définissez une dépendance B à A, vous êtes obligé de respecter l'ordre dans lequel les primaires sont définies.

Cela signifie que votre dépendance devrait ressembler à ceci: Tableau A Tableau B Colonne 1 Colonne b Colonne 2 Colonne c

ET NON: Tableau A Tableau B Colonne 2 Colonne c Colonne 1 Colonne b

alors cela conduira à l'erreur que vous rencontrez.

0
Samsky

J'ai trouvé un autre moyen d'obtenir cette erreur. Cela peut également se produire si vous essayez de créer une clé étrangère récursive (clé étrangère de la clé primaire dans la même table) en mode Création dans SQL Management Studio. Si vous n'avez pas encore enregistré la table avec la clé primaire, ce message sera renvoyé. Il suffit de sauvegarder la table pour créer la clé étrangère.

0
Caimen

On dirait que vous essayez de créer une clé étrangère dans tblTwo qui ne correspond (ou ne participe) à aucune clé primaire ou index unique dans tblOne.

Vérifiez ce lien sur MSDN à ce sujet. Ici vous avez un autre lien avec un cas pratique .

MODIFIER:

En réponse à votre commentaire, je comprends que vous voulez dire qu'il y a 2 champs dans la clé primaire (ce qui en fait un composite). En SQL, il n'est pas possible d'avoir 2 clés primaires sur la même table. 

IMHO, un champ de clé étrangère doit toujours faire référence à un seul registre dans la table référencée (c'est-à-dire la clé primaire entière dans votre cas). Cela signifie que vous devez insérer les deux champs de la clé primaire tblOne dans tblTwo avant de créer la clé étrangère.

Quoi qu’il en soit, j’ai effectué quelques recherches sur Internet et il semble que SQL Server 2008 (comme certaines versions antérieures et d’autres SGBDR) vous donne la possibilité de ne référencer qu’une partie de la clé primaire tant que cette partie est une clé candidate Unique) et vous créez une contrainte unique sur celle-ci.

Je ne suis pas sûr que vous puissiez l'utiliser dans votre cas, mais vérifiez ce lien link pour plus d'informations à ce sujet.

0
Guillem Vicens