约束:约束是作用于表中字段上的规则,限制字段中存储数据的;用于保证数据库中数据的正确,有效性和完整性的;
1. 常见约束
(1) NOT NULL 不能为null,必须有值;
(2) unique 数据不能重复;
(3) primary key 主键约束【非空并唯一】;
(4) default 默认约束;指定一个默认值;【举例:默认为5】
(5) check 检查约束(8.0.16版本之后);满足一个或多个条件;
(6) foreign key 外键约束;
【一个字段可添加多个约束】
给下面字段需求添加约束:
主键且自动增长: primary key, auto_increment
不为null,并且唯一:not null,unique
大于0,并且小于等于120 : check 检查约束
如果没有指定值就默认为1 : default 默认约束
-- 创建表并添加约束
create table mysql_test.test_user(
id int primary key auto_increment comment '主键id', -- 主键id,自动增长;
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 '用户表';
2. 外键约束
外键约束是用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性;
注意搜索引擎是否支持此外键
外键约束 分为子表与父表
· 子表: 拥有外键的表;
· 父表: 子表所关联的表;
【举例】子表 用户表,父表 部门表
建立外键关联,用户表的部门id字段里面的取值,必须在部门表的部门id字段存在;
-- 添加外键;
-- 1.在创建表的时候进行添加
/* * create table 表名( * 字段名 数据类型, * .... * [constraint][外键名称]foreign key(外键字段名) references 主表(主表列名) * ); * */
create table mysql_test.test_user1(
id int primary key auto_increment comment '主键id', -- 主键id,自动增长;
name varchar(10) not null unique comment '姓名', -- 多个约束使用空格分开;
status char(1) default '1' comment '状态', -- 默认约束
gender char(1) comment '性别',
department_id int comment '部门id',
constraint test_department_id foreign key(department_id) references mysql_test.test_department(id)
) comment '用户表';
-- 2.创建完表之后再添加 alert table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名);
ALTER TABLE mysql_test.test_user ADD CONSTRAINT test_user_FK_1 FOREIGN KEY (department_id) REFERENCES mysql_test.test_department(id);
-- 删除外键 alter table 表名 drop foreign key 外键名称;
alter table mysql_test.test_user drop foreign key test_user_FK_1;
① 外键约束数据删除操作
添加外键之后不能随意删除添加外键的数据;
(1) NO ACTION 与 RESTRICT 都不允许删除父表中带有外键的数据;
(2) cascade 同时删除子表与父表中的数据;
(3) set null 删除父表中的数据时,将子表的外键数据设置为null;
-- 指定外键父表数据删除时该有的操作 添加外键语句 + on update cascade on delete cascade;
-- on update ... on delete ...
alter table mysql_test.test_user add constraint test_user_FK_1 foreign key (department_id) references mysql_test.test_department(id) on update cascade on delete cascade;
文章评论