这是我现在刚开始学Sql的时候,在写实训报告时遇到的一个问题,大概是下面这样的。
(使用的软件:SQL Server Management Studio Management Studio 19)
三个表的创建:
1.student表的创建:
create table student
(
SID char(4) not null primary key, /*SID为student表的主键*/
Sname nvarchar(255) not null, /*Sname不能为空值*/
Sex nchar(1) not null default '男', /*Sex不能为空值,如果没有赋值,默认性别为‘男’*/
Specialty nvarchar(255),
AScorse numeric(5,1) not null,
Birthdate datetime not null,
classID char(7) foreign key(classID) references class(classID) /*classID为外键*/
)
2.Course表的创建:
create table Course
(
CID char(7) not null primary key, /*CID为Course表的主键*/
Cname nvarchar(255) not null,
Cridet numeric(3,1) not null,
KCLB nvarchar(255) not null,
ISBN char(13) foreign key(ISBN) references TextBook(ISBN) /*ISBN为外键*/
)
3.SC表的创建:
create table SC
(
SID char(4) not null foreign key(SID) references student(SID), /*SID为外键*/
CID char(7) not null foreign key(CID) references Course(CID), /*CID为外键*/
Scourse numeric(4,1) not null,
primary key(SID,CID) /*SID+CID为SC表的主键。
注意不是SID和CID为主键,因为primary key在一个表中只能有一个!*/
)
当我添加数据的时候,出现下面的错误:
【问题起源:】
这是Coures表中的数据,其中CID是Coures表的主键:
而我输入在SC表中的数据为:
由此可以看见,SC表中的CID列的值(CID是SC表中的外键)并不是Course表中CID的值(Coures表中的CID是主键) ,因此而报错
--【解析理论】:
--外键约束,比如B表存在一个字段b,有外键约束,引用于A表的主键a,那么在向B表插入数据------时,字段b必须为A表中a已经存在的值,
--如过向b中存放一个a中没有的值,则会报违反外键约束。(来自博主gocpplua的文章)
我思考了一会大概知道是因为主键和外键的关系,但是具体还不太清楚,我就到CSDN中寻求答案,我发现了几个博主的解答,他们只有一种情况,我在这总和他们的解决方法:
--【解决1】:
--在主键的表中添加数据,使得外键这个表能够找到主键表的内容
--insert into 主键表 values(val1,val2....);
--eg:
--insert into Corse values('c300331',.....);
--【解决2】:
--消除约束
--alter table 主键表
--dorp constraint 约束名;
--eg:
--alter table Course
--drop constraint FK__SC__CID__4316F928;
--【解决3】
--直接修改外键表中的值,使其等于主键表中含有的值