MySQL基础篇(三)约束

一、概述

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。

分类:
MySQL基础篇(三)约束_第1张图片
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

二、约束演示

案例需求: 根据需求,完成表结构的创建。需求如下:
MySQL基础篇(三)约束_第2张图片

CREATE TABLE tb_user(
    id     int AUTO_INCREMENT PRIMARY KEY COMMENT '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 '性别'
);

在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面的 SQL 把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

三、外键约束

1. 介绍

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

2. 语法

2.1 添加外键

CREATE TABLE 表名(
	字段名 数据类型,
	...
	[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 表(父表)删除 id 为 1 的记录,然后看一下会发生什么现象。 此时将会报错,不能删除或更新父表记录,因为存在外键约束。

2.2 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; 

案例:
删除emp表的外键fk_emp_dept_id。

alter table emp drop foreign key fk_emp_dept_id;

3. 删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
MySQL基础篇(三)约束_第3张图片
具体语法为:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

由于 NO ACTION 是默认行为,我们前面语法演示的时候,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:CASCADE、SET NULL。

(1)CASCADE

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

1️⃣修改父表 id 为1的记录,将 id 修改为 6
我们发现,原来在子表中 dept_id 值为 1 的记录,现在也变为 6 了,这就是cascade 级联的效果。
在一般的业务系统中,不会修改一张表的主键值。

2️⃣删除父表 id 为 6 的记录
我们发现,父表的数据删除成功了,但是子表中关联的记录也被级联删除了。

(2)SET NULL

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

1️⃣我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp,我们发现子表 emp 的 dept_id 字段,原来 dept_id 为1的数据,现在都被置为 NULL 了。

你可能感兴趣的:(【新】【黑马】【MySQL】,mysql,android,数据库)