【MySQL数据库入门到精通-08 约束】
文章目录
- 4、约束
- 4.1 概述
- 4.2 约束演示
- 1. 根据需求,完成表的创建
- 2. SQL数据库
- 3. 结果
- 4.3 外键约束
- 4.3.1 介绍
- 1. 根据需求,完成表的创建
- 2. SQL数据库
- 3. 结果
- 4.3.2 外键约束建立
- 1. 语法
- 2. SQL语句
- 3. 现象
- 4.3.3 外键删除更新行为
- 1. 知识点
- 2.SQL
- 3.结果
4、约束
4.1 概述
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
以下是常见的约束分类:
4.2 约束演示
1. 根据需求,完成表的创建
2. SQL数据库
代码如下(示例):
-- 约束
show databases;
use itcast;
create table tb_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 '员工表';
insert into tb_user(name, age, status, gender)VALUES('Tom1',19,'1','男'),('Tom2',25,'0','男'),('Tom3',19,'1','男')-- 测试名字name字段
insert into tb_user(name, age, status, gender)VALUES(null,19,'1','男');
insert into tb_user(name, age, status, gender)values('Tom3',19,'1','男');-- 测试名字age字段
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','男');-- 测试名字status字段
insert into tb_user(name, age, gender)VALUES('Tom5',120,'男');
3. 结果
我们是通过编写SQL语句的形式来完成约束的指定,那加入我们是通过图形化界面来创建表结构时,又该如何来指定约束呢? 只需要在创建表的时候,根据我们的需要选择对应的约束即可
4.3 外键约束
4.3.1 介绍
1. 根据需求,完成表的创建
2. SQL数据库
代码如下(示例):
-- 约束(外键)
-- 准备数据
create table dept(id int auto_increment comment 'ID' primary key ,name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept(id, name)VALUES(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经部');create table emp2(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 '直属领导ID',dept_id int comment '部门ID'
) comment '员工表';insert into emp2(id, name, age, job, salary, entrydate, managerid, dept_id)VALUES(1,'金庸',66,'总裁',20000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序鼓励师',6600,'2004-10-12',2,1);
3. 结果
上面是原始的两张表创建的数据,如果删除dept部门表的第一行数据即id=1,研发部,但是我们emp2员工表里面是有id=2-5里面关联到dept=1的研发部,目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。
结果,我们看到删除成功,而删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束。
4.3.2 外键约束建立
1. 语法
添加外键语法:
create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名)
);
alter table 表名 add constrain 外键名称 foreign key(外键字段名) references 主表(主表列名);
删除外键语法:
alter table 表名 drop foreign key 外键名称;
2. SQL语句
执行完下述SQL,会发生外键变化,dep_id外键会有个锁
黄色的小钥匙代表主键,蓝色的小钥匙代表外键。
-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);
-- 约束(外键)
-- 准备数据
create table dept(id int auto_increment comment 'ID' primary key ,name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept(id, name)VALUES(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经部');create table emp2(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 '直属领导ID',dept_id int comment '部门ID'
) comment '员工表';insert into emp2(id, name, age, job, salary, entrydate, managerid, dept_id)VALUES(1,'金庸',66,'总裁',20000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序鼓励师',6600,'2004-10-12',2,1);-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);-- 删除外键
alter table emp2 drop foreign key fk_emp2_dept_id;
3. 现象
此时外键已添加,如果此时删除主表(父表)里面的研发部ID=1,会报错。删除完外键之后,锁又会消失。
4.3.3 外键删除更新行为
1. 知识点
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行
为有以下几种:
2.SQL
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
3.结果
-- 外键的删除和更新行为
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update cascade on delete cascade ;
如果把父表对应的ID=6的记录删除,如果子表存在外键关联,那么子表对应的数据也会删除。
如果删除id为1的数据删除,现在变成NULL。
-- 约束
show databases;
use itcast;
create table tb_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 '员工表';
insert into tb_user(name, age, status, gender)VALUES('Tom1',19,'1','男'),('Tom2',25,'0','男'),('Tom3',19,'1','男')-- 测试名字name字段
insert into tb_user(name, age, status, gender)VALUES(null,19,'1','男');
insert into tb_user(name, age, status, gender)values('Tom3',19,'1','男');-- 测试名字age字段
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','男');-- 测试名字status字段
insert into tb_user(name, age, gender)VALUES('Tom5',120,'男');-- 约束(外键)
-- 准备数据
create table dept(id int auto_increment comment 'ID' primary key ,name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept(id, name)VALUES(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经部');create table emp2(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 '直属领导ID',dept_id int comment '部门ID'
) comment '员工表';insert into emp2(id, name, age, job, salary, entrydate, managerid, dept_id)VALUES(1,'金庸',66,'总裁',20000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),(6,'小昭',19,'程序鼓励师',6600,'2004-10-12',2,1);-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);-- 删除外键
alter table emp2 drop foreign key fk_emp2_dept_id;-- 外键的删除和更新行为
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update cascade on delete cascade ;alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update set null on delete set null ;