Dtpark's blog 磨刀不误砍柴工,读完硕士再打工

常见约束 |MySQL 学习笔记(三)

2022-10-31

约束是作用在表中字段上的规则,用于限制存储在表中的数据,为了保证数据库中数据的正确、完整和有效性。

一、常用约束

约束 关键字 描述
非空约束 NOT NULL 限制该字段数据不能为空
唯一约束 UNIQUE 保证该字段的所有数据都唯一(不重复)
主键约束 PRIMARY KEY 主键时一行数据的唯一标识,要求非空且唯一
默认约束 DEFAULT 保存数据时,若未指定该字段的值,采用默认值
检查约束(8.0.16版本之后) CHECK 保证字段满足某一个条件
外键约束 FOREIGN KEY 两张表的数据间建立连接
  • 例子
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 '用户表';

二、外键约束

在数据库层面,若未建立外键关联无法保证数据的一致性和完整性。

实际开发中,因性能等原因,基本不会用到 MySQL 的外键,只保留逻辑外键。

  • 外键约束的相关概念
    • 父表:外键关联的表
    • 子表:具有外键的表
  • 语法
# 添加外键(建表时添加)
CREATE TABLE 表名(
  字段名 数据类型
  ...
  [constraint] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);

# 添加外键(修改字段时添加)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

# 删除外键
alter table emp drop foreign key 外键名称;

# 删除/更新外键时的行为
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名) ON UPDATE 更新行为 ON DELETE 删除行为;
  • 删除/更新行为
行为 说明
NO ACTION 在父表中删除/更新记录时,首先检查该记录是否有对应外键,若有则不允许更新
RESTRICT 在父表中删除/更新记录时,首先检查该记录是否有对应外键,若有则不允许更新
CASCADE 在父表中删除/更新记录时,首先检查该记录是否有对应外键,若有则也删除/更新外键所在子表中的记录
SET NULL 删除在父表中删除对应记录时,首先检查该记录是否有对应外键,若有则设置子表中该外键值为NULL(允许为空时)
SET DEFAULT 父表有变更时,子表将外键列设置成一个默认值(innodb 不支持)
  • 例子
# 创建部门表
create table dept (
    id int auto_increment comment 'id' primary key,
  name varchar(50) not null comment '部门名称'
) comment '部门表';

# 创建员工表
create table emp(
    id int auto_increment comment 'id' primary key,
  name varchar(50) not null comment '姓名',
  age int comment '年龄',
  job varchar(20) comment '职位',
  salary int comment '薪资',
  entrydate date comment '入职时间',
  managerid int comment '直属领导',
  dept_id int comment '部门ID'
) comment '员工表';

# 添加外键
alter table emp add add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

Similar Posts

Comments