sql 无法用alter添加主键,错误为无法在表 'table' 中可为 Null 的列上定义 PRIMARY KEY 约束。求解

sql 无法用alter添加主键,错误为无法在表 'table' 中可为 Null 的列上定义 PRIMARY KEY 约束。求解,第1张

这样的错误提示,说明你的表中已经有数据了,并且在你要添加主键约束的列,存在空值,而SQL规定,设置为主键约束的列,不能存在空值。

解决办法:

删除要添加主键约束列为空值的元组(就是行);

如果你只是做测试,数据不重要得话,可以删除表中所有数据;用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的作用

--主键的值改变后,引用它的外键的值也随之改变

--最后顺便一提,童川是我的室友,恶搞一下他,嘿嘿···


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11449246.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存