当我索要的一切东西都离我而去
有一天
我重新拾起做回甲乙丙丁的勇气
—— 24.3.5
一、概述
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确、有效性和完整性
分类:
约束 描述 关键字
非空约束 限制该字段的数据不能为null not null
唯一约束 保证该字段的所有数据都是唯一,不重复的 unique
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 default
检查约束 保证字段值满足一个条件 check
外键约束 用来让两张表的数据之间建立联系,保证数据的一致性和完整性 foreign key
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
二、约束演示
案例
根据需求,完成表结构的创建
字段名 字段含义 字段类型 约束条件 约束关键字
id id唯一标识 int 主键,并且自动增长 primary key,auto_increment
name 姓名 varchar(10) 不为空,并且唯一 not null,unique
age 年龄 int 大于0,并且小于等于120 check
status 状态 char(1) 如果没有指定的值默认为1 default
gender 性别 char(1) 无
建表sql语句:
create table user( id int primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int check( age > 0 && age <= 120 ) comment '年龄', status char(1) default '1' comment '状态', gender char(1) comment '性别' ) comment '用户表';
插入数据:主键约束及自动增长
insert into user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',25,'0','男'); insert into user(name,age,status,gender) values ('Tom3',19,'1','男');
非空约束:
insert into user(name,age,status,gender) values (null,19,'1','男'); #not null约束,报警告,主键不能为空
唯一约束:
insert into user(name,age,status,gender) values ('Tom3',19,'1','男'); #unique约束,不能重复
检查约束:保证了数据的安全性和合理性
如果有默认值,数据为空时,直接使用default默认值
主键约束=非空约束+唯一约束
default默认值约束
三、外键约束
概念
外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
语法
添加外键
create table 表名( 字段名 数据类型 … [constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名) );
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
删除外键
alter table 表名 drop foreign key 外键名;
案例
添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
删除外键
alter table emp drop foreign key fk_emp_dept_id;
外键保证了数据的一致性和完整性
删除/更新行为
行为 说明
no action
当在副表中删除/更新对应记录时,先检查该纪录是否有对应外键,有则不允许删除/更新
restrict
当在副表中删除/更新对应记录时,先检查该纪录是否有对应外键,有则不允许删除/更新
cascade
当在副表中删除/更新对应记录时,先检查该纪录是否有对应外键,有则也删除/更新外键在子表中的记录
set null
当在副表中删除/更新对应记录时,先检查该纪录是否有对应外键,有则设置子表中外键值为null(这要求允许外键值为null)
set default 父表有变更时,子表将外键列设置成一个默认的值(innodb不支持)
语法
alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) on update cascade on delete cascade;
总结