日期:2014-05-17  浏览次数:20657 次

【联合主键的外键问题请教】没有与..引用列列表匹配的主键或候选键。

--【联合主键的外键问题请教】没有与..引用列列表匹配的主键或候选键。

--建立图书表
Create Table Books
(
Id int IDENTITY(1,1) not null,
Title nvarchar(200) not null,
PublishDate datetime not null,
ISBN nvarchar(50) not null,
UnitPrice money not null,
ContentDescription nvarchar(max) null,
CategoryId int not null, --分类ID,打算作为外键

CONSTRAINT PK_BID_ISBN Primary Key(Id,ISBN) --联合作主键,Id,ISBN都是主键了
)
GO

--建立分类表:
Create Table Categories
(
Id int IDENTITY(1,1) Not null, --分类表的主键之一(联合主键)
Name nvarchar(200) not null,
CONSTRAINT PK_Cate_ID_Name Primary Key(Id,Name) --联合作主键,Id,Name 都是主键了
)
GO

Alter Table Books 
Add Constraint FK_Books_Cates 
Foreign Key (CategoryId) references Categories(Id)
--报错:
/*消息 1776,级别 16,状态 0,第 1 行
在被引用表 'Categories' 中没有与外键 'FK_Books_Cates' 中的引用列列表匹配的主键或候选键。
无法创建约束。请参阅前面的错误消息。
*/
--【疑问】分类表的ID已经是主键了的啊,为什么会报错呢??

--【疑问】先对分类表的ID字段建立唯一约束后再执行上面的创建外键语句就成功了,为什么??
Alter Table Categories
add CONSTRAINT pk_cateid_unique unique(id)

外键 联合主键

------解决方案--------------------
【疑问】分类表的ID已经是主键了的啊,为什么会报错呢??

联合主键,id并不一定唯一。

【疑问】先对分类表的ID字段建立唯一约束后再执行上面的创建外键语句就成功了,为什么??

先建立了唯一约束后,建立主键的条件就具备了,所以可以创建外键成功。
------解决方案--------------------
外键必须是主表的主键或者unique约束
------解决方案--------------------
引用:
【疑问】分类表的ID已经是主键了的啊,为什么会报错呢??

联合主键,id并不一定唯一。

【疑问】先对分类表的ID字段建立唯一约束后再执行上面的创建外键语句就成功了,为什么??

先建立了唯一约束后,建立主键的条件就具备了,所以可以创建外键成功。

------解决方案--------------------
id 做主键就已经保证唯一了,没必要弄复合主键,在项目中确实也很少用复合主键