创建表时外键约束出错

cllover 2010-10-28 10:04:56
--创建表Reader
create table Reader(
Rno varchar(12) primary key not null
,Rname nvarchar(10)
,Rsex nchar(1) check(Rsex in ('男','女'))
,Rage int check(Rage<55)
,Rdept nvarchar(15)
,RBno varchar(15)
,Rtype int
,check(Rno like 'L%' and len(Rno)=6)
)
go
--创建表Book
create table Book(
Bno varchar(15) primary key not null
,Bname nvarchar(15)
,Bauthor nvarchar(10)
,Bpub nvarchar(15)
,Bodate date --出版日期
,Bidate date --入库日期
)
go
--创建表RB
create table RB(
RBno varchar(15)
,Bno varchar(15) not null
,BorrowDate date
,ReturnDate date
primary key(RBno,Bno),
foreign key(RBno) references Reader(RBno),
foreign key(Bno) references Book(Bno)
)




//错误


消息 1776,级别 16,状态 0,第 2 行
在被引用表 'Reader' 中没有与外键 'FK__RB__RBno__5070F446' 中的引用列列表匹配的主键或候选键。
消息 1750,级别 16,状态 0,第 2 行
无法创建约束。请参阅前面的错误消息。


ask for help
...全文
267 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cllover 的回复:]
--创建读者表Reader(Rno(读者编号),Rname(读者姓名),Rsex(读者性别),Rage(读者年龄),RDept(所在院系),RBno(借书证号),Rtype(类别));
--创建图书表Book(Bno(图书编号),Bname(书名),Bauthor(作者),Bpub(出版社),Bodate(出版日期),Bidate(入库日期));
--创建借阅表RB(RBno(借书证号),Bno(图书编号),BorrowDate(借出日期),ReturnDate(应还日期))

在Reader中Rno是主键,RBno不是主键,
在RB中RBno,Bno是主键,引用Reader中RBno以及Book中Bno

难道外键非得是主键吗
小弟初学,望指教[/Quote]

是唯一值的列也行。
abuying 2010-10-28
  • 打赏
  • 举报
回复

FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束

所以把RBno 改为 UNIQUE not null 唯一性就行了。

abuying 2010-10-28
  • 打赏
  • 举报
回复
外键当然是主码之一。
cllover 2010-10-28
  • 打赏
  • 举报
回复
--创建读者表Reader(Rno(读者编号),Rname(读者姓名),Rsex(读者性别),Rage(读者年龄),RDept(所在院系),RBno(借书证号),Rtype(类别));
--创建图书表Book(Bno(图书编号),Bname(书名),Bauthor(作者),Bpub(出版社),Bodate(出版日期),Bidate(入库日期));
--创建借阅表RB(RBno(借书证号),Bno(图书编号),BorrowDate(借出日期),ReturnDate(应还日期))

在Reader中Rno是主键,RBno不是主键,
在RB中RBno,Bno是主键,引用Reader中RBno以及Book中Bno

难道外键非得是主键吗
小弟初学,望指教
dawugui 2010-10-28
  • 打赏
  • 举报
回复
--创建表Reader
create table Reader(
Rno varchar(12)
,Rname nvarchar(10)
,Rsex nchar(1) check(Rsex in ('男','女'))
,Rage int check(Rage<55)
,Rdept nvarchar(15)
,RBno varchar(15) primary key not null
,Rtype int
,check(Rno like 'L%' and len(Rno)=6)
)
go
--创建表Book
create table Book(
Bno varchar(15) primary key not null
,Bname nvarchar(15)
,Bauthor nvarchar(10)
,Bpub nvarchar(15)
,Bodate datetime --出版日期
,Bidate datetime --入库日期
)
go
--创建表RB
create table RB(
RBno varchar(15)
,Bno varchar(15) not null
,BorrowDate datetime
,ReturnDate datetime
primary key(RBno,Bno),
foreign key(RBno) references Reader(Rbno),
foreign key(Bno) references Book(Bno)
)


drop table RB
drop table Book
drop table Reader
dawugui 2010-10-28
  • 打赏
  • 举报
回复
foreign key(RBno) references Reader(RBno),

Reader表的RBno列是非主键,不能创建外键关系。
-晴天 2010-10-28
  • 打赏
  • 举报
回复
Rbno varchar(12) primary key not null
--小F-- 2010-10-28
  • 打赏
  • 举报
回复
消息 1776,级别 16,状态 0,第 2 行
在被引用表 'Reader' 中没有与外键 'FK__RB__RBno__5070F446' 中的引用列列表匹配的主键或候选键。消息 1750,级别 16,状态 0,第 2 行
无法创建约束。请参阅前面的错误消息。

比较明显的提示了

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧