跟着小豆学SQL:3 [基础]约束
# 现在我们需要添加约束,这可以保证你所插入的数据是符合你想要的
# primary key 主键约束,固定且不唯一
# auto_increment 自增长约束,设置后此字段可不设数据由数据库自动设置,常用于id,通常配合主键使用
# not null 不为空,指定字段值不为null
# unique 唯一,此字段内所有列的数据不能够与任何此列下的数据重复
# check 逻辑约束,可通过简单判断约束字段数据 8.xx后才增加,这里不做演示
# default 默认 无约束
# 选择数据库
use test;
# 现在我们删除user表
drop table user;
# 创建一个更复杂的表
create table user (
id int auto_increment primary key comment 'ids', # 主键 自增 唯一
name varchar(6) not null comment '姓名', # 不为空
age int not null , # check ( age > 0 and age < 100 ) 此为check演示,可参考
idcard varchar(16) unique comment '身份证', # 唯一
gender char(1) not null comment '性别' # 不唯一且不为空,仅为男,女
) comment '用户表';
# 查看表结构
desc user;
alter table user change idcard idcard varchar(16) unique comment '身份证';
insert into user values (null,'A',16,111111111111111,'男'),
(null,'B',15,222222222222222,'男'),
(null,'C',18,333333333333333,'女');
select * from user;
# 为product添加字段,为添加外键约束做准备
alter table product add user_id int not null comment '发布人id';
# 为product的user_id添加外外键约束
alter table product add constraint publisher foreign key (user_id) references user(id);
desc product;
# 使用datagrip打开product表可以看到user_id字段变蓝并且多了一个锁,这代表我们外键约束添加成功
# 外键约束是对 父数据更新/删除时子表所做操作
# restrict 限制 父表更新/删除时,检查子表是否有对应外键数据,有则不允许更新/删除
# cascade 串联/向下传递 父表更新/删除时,同步删除/更新子表
# set null 置空 父表更新/删除时,子表设置为空
# set default 设置为默认值,父表有更新时,子表设置为一个默认值,innodb不支持
# 外键只能删除重建,不能够修改
alter table product drop foreign key publisher;
desc product;
# 创建外键会自动创建索引,这里删除 后面会说
alter table product drop index publisher;
alter table product add constraint publisher foreign key (user_id) references user(id) on update cascade on delete restrict ;
# 这里外键即添加成功
insert into product values ('QA','1.1',1,now(),1),
('QS','2',0,now(),2),
('QD','3',5,now(),3);
select *
from product;
# 数据添加完成,删除一个用户试试
delete from user where id = 1; # 报错了,因为子表存在数据,因此父表不允许被删除
# 如果我们试一试修改id呢?(业务中非常不推荐修改唯一且固定的主键id!!!务必
update user set id = 5 where id = 1; # 正常运行了,让我们看看两个表
select * from user; # 用户表中id已经更改
select * from product; # 可以看到 子表中QA的user_id也变成了5,这就是最主要的两个示例,剩下两个请自行探索
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。