Clé étrangère faisant référence à une clé primaire de 2 colonnes dans le serveur SQL
cette question est assez similaire à celle-ci , mais pour SQL Server 2005:
j'ai 2 tables dans ma base de données:
--'#' denotes the primary key
[Libraries]
#ID #Application Name
1 MyApp Title 1
2 MyApp Title 2
[Content]
#ID Application LibraryID Content
10 MyApp 1 xxx
11 MyApp 1 yyy
(la base de données est évidemment beaucoup plus complexe et ayant cette double clé de sens)
chaque Bibliothèque est identifiée par son ID unique et son nom D'Application. J'essaie de m'assurer que chaque contenu est correctement référencé par une bibliothèque existante.
lors de la création de la contrainte (en utilisant L'Assistant) comme
Primary key table Foreign key table
[Libraries] [Content]
ID ---> LibraryID
Application ---> Application
j'ai l'erreur suivante:
les colonnes du tableau 'bibliothèques' font ne correspond pas à une clé primaire existante ou UNIQUE constraint
avez-vous une idée de ce qui se passe? et si C'est possible en utilisant SQL Server? (Je ne peux pas modifier la [Bibliothèque] tableau)
Merci beaucoup pour votre à l'aide!
5 réponses
bien sûr, il est possible de créer une relation clé étrangère à une clé primaire composée (plus d'une colonne). Vous ne nous avez pas montré la déclaration que vous utilisez pour essayer de créer cette relation - il devrait être quelque chose comme:
ALTER TABLE dbo.Content
ADD CONSTRAINT FK_Content_Libraries
FOREIGN KEY(LibraryID, Application)
REFERENCES dbo.Libraries(ID, Application)
c'est ce que vous utilisez?? Si (ID, Application)
est effectivement la clé primaire sur dbo.Libraries
, cet énoncé devrait certainement fonctionner.
Luk: juste pour vérifier - pouvez-vous exécuter cette déclaration dans votre base de données et rapport de retour Quel est le résultat??
SELECT
tc.TABLE_NAME,
tc.CONSTRAINT_NAME,
ccu.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE
tc.TABLE_NAME IN ('Libraries', 'Content')
Notez que les champs doivent être dans le même ordre. Si la clé primaire que vous référencez est spécifiée comme (Application, ID) alors votre clé étrangère doit faire référence (Application, ID) et non (ID, Application) car ils sont considérés comme deux clés différentes.
la table Content
est susceptible d'avoir plusieurs valeurs dupliquées Application
qui ne peuvent pas être mappées à Libraries
. Est-il possible de supprimer la colonne Application
de l'Index de la clé primaire Libraries
et de l'ajouter comme Index de la clé Unique à la place?
j'ai eu le même problème et je pense avoir la solution.
si votre champ Application
dans la table Library
a une clé étrangère qui renvoie à un champ dans une autre table (nommé Application
je parie), alors votre champ Application
dans la table Library
doit avoir une clé étrangère à la table Application
aussi.
après cela, vous pouvez faire votre clé étrangère composée.
Excusez mon mauvais anglais, et désolé si je suis mauvais.
La clé, c'est "l'ordre de la colonne doit être le même"
exemple:
create Table A (
A_ID char(3) primary key,
A_name char(10) primary key,
A_desc desc char(50)
)
create Table B (
B_ID char(3) primary key,
B_A_ID char(3),
B_A_Name char(10),
constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name)
)
l'ordre des colonnes du tableau A doit être -- > A_ID
puis A_Name
; la définition de la clé étrangère doit suivre le même ordre.