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!

21
demandé sur Community 2010-07-05 14:21:28

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')
38
répondu marc_s 2010-07-05 15:29:42

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.

7
répondu Will Russell 2014-03-18 14:43:34

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?

1
répondu Adrian Godong 2010-07-05 10:27:23

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.

0
répondu Alex France 2012-10-03 19:56:44

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.

0
répondu danny 2017-05-19 05:49:12