sql server 主键与外键约束无法创建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 主键与外键约束无法创建相关的知识,希望对你有一定的参考价值。

RT 代码是这样的:CREATE table 会员证
(
会员编号 varchar(20),
会员姓名 varchar(10),
会员年龄 int,
会员住址 varchar(50),
primary key (会员编号,会员姓名))
create table 图书
(
书号 int,
书名 varchar(20) not null,
价格 decimal(6,2),
页数 int,
出版社 varchar(50) default '清华大学出版社',
作者 varchar(50),
primary key (书号)
)
create table 借阅
(
会员编号 varchar(20)references 会员证(会员编号),
会员姓名 varchar(20)references 会员证(会员姓名),
书号 int references 图书(书号),
借阅时间 datetime,
归还时间 datetime,
primary key (会员编号,会员姓名,书号)
)

提示错误:
消息 1776,级别 16,状态 0,第 18 行
在被引用表 '会员证' 中没有与外键 'FK__借阅__会员编号__52593CB8' 中的引用列列表匹配的主键或候选键。
消息 1750,级别 16,状态 0,第 18 行
无法创建约束。请参阅前面的错误消息。

建议改成这样

create table 会员证 (
会员编号 varchar(20),
会员姓名 varchar(10),
会员年龄 int,
会员住址 varchar(50),
primary key (会员编号) )

create table 图书 (
书号 int,
书名 varchar(20) not null,
价格 decimal(6,2),
页数 int,
出版社 varchar(50) default '清华大学出版社',
作者 varchar(50),
primary key (书号) )

create table 借阅 (
会员编号 varchar(20) foreign key references 会员证(会员编号),
书号 int foreign key references 图书(书号),
借阅时间 datetime,
归还时间 datetime,
primary key (会员编号,书号,借阅时间) )

一般user表只用一个id或者编号来做主键

参考技术A 外键引用要求引用键必须是唯一键,如果是联合主键,那么算作联合唯一,不能作为外键引用
像你的表,一般只需要把编号设置为主键即可,姓名作为冗余字段可加可不加追问

我是不是只需要吧编号设置为主键就不会报错了?

追答

你需要把会员证表中的编号设置为主键,姓名其实就不用管了
如果你下面还需要把姓名用作外键,那么姓名需要设置唯一键约束,
因为姓名会有重名的嘛,所以一般建议表与表关联设置只用编号就行了

以上是关于sql server 主键与外键约束无法创建的主要内容,如果未能解决你的问题,请参考以下文章

sql server的主键与外键问题

SQL Server:主键与外键设置与相关理解

如何分清SQL数据库中的主键与外键

数据库中的主键与外键的关系

数据库的主键与外键

主键与外键