解决办法:
删除要添加主键约束列为空值的元组(就是行);
如果你只是做测试,数据不重要得话,可以删除表中所有数据;用delete * from 表名。
然后再运行你的添加主键的命名。
建议改成这样
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或者编号来做主键
--我也是初学者,共同研究下,你最好一段一段执行,要不就没意义了use school
drop table teacher1
drop table student1
go
create table teacher1
(
t_id int primary key,
t_name nvarchar(10) not null
)
go
insert into teacher1 values(1347,'张三')
insert into teacher1 values(2680,'李四')
insert into teacher1 values(6379,'王五')
go
create table student1
(
s_id int primary key,
t_id int
)
go
alter table student1
add constraint FK foreign key(t_id) references teacher1(t_id) on update cascade
insert into student1 values(1,2680)
insert into student1 values(2,6379)
insert into student1 values(3,1347)
insert into student1 values(4,6379)
insert into student1 values(5,1347)
--两个表建好了,大概按照你的意思,不知道是不是这种情况
go
select * from student1
select * from teacher1 --查询所有数据
go
--在student1表(外键表)中加入一组数据
insert into student1 values(6,1234) --失败了,因为外键表中外键的值必须是引用主键表中关联的主键的值
--也就是外键约束,或称参照完整性
--外键约束是约束外键的数据的取值的
insert into teacher1 values(1234,'童川') --然后在teacher1表(主键表)中加一组数据
--成功,外键约束对主键表被引用的主键无影响
insert into student1 values(6,1234) --成功,验证了失败的原因
go
select * from student1
select * from teacher1 --再次查询所有数据
--on update cascade 这个东西我也没学过,百度了一下,大概明白了
go
update teacher1 set t_id = t_id + 10000
where t_name in('童川') --成功
update student1 set t_id = t_id + 10000 --提示与外键约束发生冲突
go
select * from student1
select * from teacher1 --看到了么?学生表中引用'童川'老师的数据的一列数据中t_id的值也随之改变
--我想这就是on update cascade的作用
--主键的值改变后,引用它的外键的值也随之改变
--最后顺便一提,童川是我的室友,恶搞一下他,嘿嘿···
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)