mysq约束和外键删除/更新行为

约束

概述

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

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一的,不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束保证字段值满足某一个条件CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

例子:

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) 无

create table if not exists user(
    id int primary key auto_increment comment 'ID',
    name varchar(10) not null unique comment '姓名',
    age int check ( age>0 and age<120 ) comment '年龄',
    status char(1) default 1 comment '状态',
    gender char(1) comment '性别'
) comment '用户表';

外键约束

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

例如给了两张表:

emp:
+----+--------+-----+--------------+-------+------------+-----------+--------+
| id | name  | age | job          | salary | entrydate   | managerid | dept_id |
+----+--------+-----+--------------+-------+------------+-----------+--------+
|  1 | 金庸   |  66 | 总裁         | 20000 | 2000-01-01 | NULL      |      5 |
|  2 | 张无忌 |  20 | 项目经理     | 12500 | 2005-12-05 |         1 | NULL   |
|  3 | 杨逍   |  33 | 开发         |  8400 | 2000-11-03 |         2 | NULL   |
|  4 | 韦一笑 |  48 | 开
发         | 11000 | 2002-02-05 |         2 | NULL   |
|  5 | 常遇春 |  43 | 开发         | 10500 | 2004-09-07 |         3 | NULL   |
|  6 | 小昭   |  19 | 程
序员鼓励师 |  6600 | 2004-10-12 |         2 | NULL   |
+----+--------+-----+--------------+-------+------------+-----------+--------+
dept:
+----+--------+
| id | name  |
+----+--------+
|  2 | 市场部 |
|  3 | 财务部 |
|  4 | 销售部 |
|  5 | 总经办 |
+----+--------+

emp表中的dept_id和dept表中的id关联,其中dept_id是关联部门表dept的主键id,哪emp表中的dept_id是外键,关联另一张表的主键。

如果删除emp表中的dept_id,dept表中的数据不会受影响,这样就会导致数据不完整性

添加外键
alter table 子表 add constraint 外键名称 foreign key(子表外键字段) references 父表(父表关联字段);

# 为emp表中的dept_id字段添加外键约束,关联dept表中的主键id
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

这个时候由于外键的约束就不能删除父表dept记录,因为存在外键约束.

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

alter table emp drop foreign key fk_emp_dept_id;

删除/更新行为

添加外键后,再删除父表数据的行为称为删除/更新行为
以下几种:

行为说明
NO ACTION在父表中删除/更新记录时,首先检查记录中是否有外键,有则不允许删除/更新
RESTRICT当在父表中删除/更新记录时,首先检查记录中是否有外键,有则不允许删除/更新
CASCADE当在父表中删除/更新记录时,首先检查该记录是否有对应的外键,如果有,则也删除/更新外键在子表中的记录
set NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中外键值为null
set default父表变更时,子表将外键列设置成一个默认的值(Innodb不支持)

例如:
1、cascade

## cascade
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update cascade on delete cascade ;

设置外键的删除更新行为时cascade后,我修改父表id中1改成6

 ##  dept表和emp表中1号部门全部自动改成6号部门

# dept表
+----+-----------+
| id | name      |
+----+-----------+
|  2 | 市场部    |
|  3 | 财务部    |
|  4 | 销售部    |
|  5 | 总经办    |
|  6 | 研发部    |
+----+-----------+

# emp表
+----+-----------+------+----------------------+--------+------------+-----------+---------+
| id | name      | age  | job                  | salary | entrydate  | managerid | dept_id |
+----+-----------+------+----------------------+--------+------------+-----------+---------+
|  1 | 金庸      |   66 | 总裁                 |  20000 | 2000-01-01 |      NULL |       5 |
|  2 | 张无忌    |   20 | 项目经理             |  12500 | 2005-12-05 |         1 |       6 |
|  3 | 杨逍      |   33 | 开发                 |   8400 | 2000-11-03 |         2 |       6 |
|  4 | 韦一笑    |   48 | 开
发               |  11000 | 2002-02-05 |         2 |       6 |
|  5 | 常遇春    |   43 | 开发                 |  10500 | 2004-09-07 |         3 |       6 |
|  6 | 小昭      |   19 | 程
序员鼓励师       |   6600 | 2004-10-12 |         2 |       6 |
+----+-----------+------+----------------------+--------+------------+-----------+---------+

2、SET NULL

## set null
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ;

设置外键约束的更新/删除行为后,如果删除id为1的记录后,那么子表emp中的1部门改为null

## 将dept中的1部门删除,原来emp表中的1部门全部自动变为null
# dept表
+----+-----------+
| id | name      |
+----+-----------+
|  2 | 市场部    |
|  3 | 财务部    |
|  4 | 销售部    |
|  5 | 总经办    |
+----+-----------+

# emp表
+----+-----------+------+----------------------+--------+------------+-----------+---------+
| id | name      | age  | job                  | salary | entrydate  | managerid | dept_id |
+----+-----------+------+----------------------+--------+------------+-----------+---------+
|  1 | 金庸      |   66 | 总裁                 |  20000 | 2000-01-01 |      NULL |       5 |
|  2 | 张无忌    |   20 | 项目经理             |  12500 | 2005-12-05 |         1 |    NULL |
|  3 | 杨逍      |   33 | 开发                 |   8400 | 2000-11-03 |         2 |    NULL |
|  4 | 韦一笑    |   48 | 开
发               |  11000 | 2002-02-05 |         2 |    NULL |
|  5 | 常遇春    |   43 | 开发                 |  10500 | 2004-09-07 |         3 |    NULL |
|  6 | 小昭      |   19 | 程
序员鼓励师       |   6600 | 2004-10-12 |         2 |    NULL |
+----+-----------+------+----------------------+--------+------------+-----------+---------+
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值