外键引用SQL Server中的2列主键

时间:2010-07-05 10:21:29

标签: sql sql-server-2005 foreign-key-relationship

这个问题与this one非常相似,但对于SQL Server 2005:

我的数据库中有2个表:

--'#' 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

(数据库显然要复杂得多,而且这个双键很有意义)

每个库都由其唯一ID和应用程序名称标识。我正在尝试确保每个内容都正确引用现有库。

创建约束(使用向导)时

Primary key table            Foreign key table
[Libraries]                  [Content]
ID                  --->     LibraryID
Application         --->     Application

我有以下错误:

  

表'Libraries'中的列有   与现有主键不匹配或   UNIQUE约束

你知道发生了什么吗?如果它可以使用SQL Server? (我根本无法修改[Library]表)

非常感谢你的帮助!

5 个答案:

答案 0 :(得分:41)

当然,可以创建与复合(多个列)主键的外键关系。你没有向我们展示你用来尝试创建这种关系的陈述 - 它应该是这样的:

ALTER TABLE dbo.Content
   ADD CONSTRAINT FK_Content_Libraries
   FOREIGN KEY(LibraryID, Application)
   REFERENCES dbo.Libraries(ID, Application)

你正在使用的是什么?如果(ID, Application)确实是dbo.Libraries上的主键,则此语句肯定会有效。

Luk:只是为了检查 - 你能在你的数据库中运行这个语句并报告输出是什么吗?

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')

答案 1 :(得分:7)

请注意,这些字段的顺序必须相同。如果您引用的主键被指定为(应用程序,ID),那么您的外键必须引用(应用程序,ID)和NOT(ID,应用程序),因为它们被视为两个不同的键。

答案 2 :(得分:1)

Content表可能有多个无法映射到Application的重复Libraries值。是否可以从Application主键索引中删除Libraries列并将其添加为唯一键索引?

答案 3 :(得分:1)

键是"列的顺序应该相同"

示例:

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)
)

表A上的列顺序应为 - > A_ID然后A_Name;定义外键也应遵循相同的顺序。

答案 4 :(得分:0)

我有同样的问题,我认为我有解决方案。

如果表Application中的字段Library有一个外键引用另一个表中的字段(我打赌会命名为Application),那么您的字段Application就在表Library也必须有一个表Application的外键。

之后你可以做你的组合外键。

请原谅我可怜的英语,对不起,如果我错了。