约束概述

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

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

约束有以下几种分类:

因为约束时作用于表中字段的,所以可以在创建表/修改表时进行添加

根据需求,完成该 user 表的创建:

上述SQL语句:

1
2
3
4
5
6
7
CREATE TABLE USER (
id INT PRIMARY KEY auto_increment 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 '性别'
) COMMENT '约束练习';

外键约束

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

具有外键的表我们称之为子表(从表),而其关联的另一张表称之为父表(主表)

添加外键:

1
2
3
4
5
6
7
ALTER TABLE emp ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);

-- 也可以在创建表时添加
CREATE TABLE 表名 (
字段名 数据类型,
CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);

删除外键:

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

外键默认是不允许更新或删除的,这与其更新/删除行为有关,主要有以下几种:

可以在外键相关SQL语句后面更新该行为,如:

1
ALTER TABLE emp ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名) ON UPDATE 行为 ON DELETE 行为;

案例练习

将之前的 emp(员工)表删除,创建一个 dept(部门) 表和 emp(员工)表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- dept表
CREATE TABLE dept ( id INT auto_increment COMMENT 'ID' PRIMARY KEY, NAME VARCHAR ( 50 ) NOT NULL COMMENT '部门名称' ) COMMENT '部门表';

-- emp表
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 '员工表';

插入相应的数据:

1
2
3
4
5
6
7
8
9
10
11
12
-- dept表
INSERT INTO dept ( id, NAME ) VALUES( 1, '研发部' ),(2,'市场部' ),(3,'财务部' ),(4,'销售部' ),(5,'总经办' );

-- emp表
INSERT INTO emp
VALUES
( NULL, '金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5 ),
( NULL, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1 ),
( NULL, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1 ),
( NULL, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1 ),
( NULL, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1 ),
( NULL, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1 );

给 emp 表添加外键:

1
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);

当成功添加外键后,这时我们想删除部门表的研发部时会报错,提示存在外键。我们可以删除该外键:

1
ALTER TABLE emp drop FOREIGN key fk_emp_dept_id;

这时就可以将研发部给删除掉了

给外键添加 CASCADE 行为后,可以看出员工表一旦发生变化,那么 emp 表其对应的部门 id 也会跟随着其改变

1
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);