mysql六种约束详解

一、概述

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

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

分类:

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

注意: 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

二、约束演示

上面我们介绍了数据库中常见的约束,以及约束涉及到的关键字,那这些约束我们到底如何在创建表、修改表的时候来指定呢,接下来我们就通过一个案例,来演示一下。

案例需求: 根据需求,完成表结构的创建。需求如下:

 

 

对应的建表语句为:

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把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

三、外键约束

1、 什么是外键约束?

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

我们先来看一个例子

 

 

 

左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。

2、 不使用外键有什么影响?

通过上面的示例,我们分别来演示 添加外键 和不添加外键的区别,首先来看不添加 外键 对数据有什么影响:

准备数据:

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 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 '直属领导ID',
dept_id INT COMMENT '部门ID' 
) COMMENT '员工表';

INSERT INTO emp (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);

  

 

 接下来,我们可以做一个测试,删除id为1的部门信息。

结果,我们看到删除成功,而删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束。

正常开发当中有时候会通过业务代码来控制数据的不完整性,例如删除部门的时候会先根据部门id去查看一下有没有对应的员工表,如果有则删除失败,没有则删除成功。

3、 添加外键的语法

可以在创建表的时候直接添加外键,也可以对现已存在的表添加外键。

方式一

CREATE TABLE 表名( 
    字段名 数据类型, 
    ... 
    [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) 
);

示例:

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 '直属领导ID',
    dept_id INT COMMENT '部门ID',
    CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept (id)  
) COMMENT '员工表';

也可以省略掉CONSTRAINT fk_emp_dept_id 这样mysql就会自动给我们起外键名称。

方式二 对现有的表添加外键

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;

使用示例

alter table emp add constraint fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);

方式三 使用Navicat添加外键

 

 删除外键

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

使用示例

alter table emp drop foreign key fk_emp_dept_id;

4、 删除/更新行为

添加了外键之后,在删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

 

 

转发自 https://blog.csdn.net/weixin_43888891/article/details/125966045 

 

posted @ 2023-02-24 15:01  羊脂玉净瓶  阅读(137)  评论(0)    收藏  举报