约束:常见约束(常见约束-例子,外键约束)
目录
常见约束
常见约束-例子
外键约束
添加或删除外键
添加外键
删除外键
外键的删除/更新行为
外键的删除/更新行为有哪些
指定外键的删除/更新行为-语法
案例
CASCADE(级联)-例子
SET NULL-例子
常见约束
约束:约束是作用于表中字段上的规则,是用来限制表中所存储的数据的。
约束的作用:约束是用来保证数据库中数据的正确性,有效性,完整性和一致性。
常见的约束:
约束 | 描述 | 关键字 |
非空约束 | 限制该字段的数据不为NULL | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一的,不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一(一个表只能有一个主键字段) | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束(8.0.16版本之后支持) | 保证字段值满足某一个条件或多个 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
注意:
- 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
- 在MySQL中,注意CHECK要放到最后写
- 主键约束要想实现自增,可以加上AUTO_INCREMENT
常见约束-例子
需求:根据下表的要求,完成表结构的创建
用户表user
字段名 | 字段含义 | 字段类型 | 约束条件 |
id | id(唯一标识) | INT | 主键,且自动增长 |
name | 姓名 | VARCHAR(10) | 不为空,且唯一 |
age | 年龄 | INT | 大于0,且小于等于120 |
status | 状态 | CHAR(1) | 如果未指定值,则默认为1 |
gender | 性别 | CHAR(1) | 无 |
注意:
- 自动增长的关键字:AUTO_INCREMENT,该字段是自增的,由数据库维护数据,不用插入数据
- 代码中,多个约束之间空格分开即可
代码:
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'id主键',
user_name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',
age INT COMMENT '年龄',
user_status CHAR(1) DEFAULT '1' COMMENT '状态',
gender CHAR(1) COMMENT '年龄',
CHECK (age > 0 AND age < 120)
) COMMENT '用户表';
运行后,user表
在user表中插入数据
代码:
INSERT INTO user(user_name, age, user_status, gender)
VALUES('hyh', 23, '1', '女'),
('hyh2', 43, '0', '男'),
('hyh3', 21, '0', '女'),
('hyh4', 18, '1', '男');
运行后,user表中数据
注意:id是自增的
外键约束
外键约束:用来让两张表的数据之间建立连接,保证数据的一致性和完整性(通过外键约束来保证数据的一致性和完整性)
添加或删除外键
添加外键
建立外键关联语法-在建立表的时候添加:
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);
建立外键关联语法-有表,额外增加外键关联:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
示例如下:
有两个表
emp员工表
dept部门表
建立两个表之间的外键关联,emp作为子表,dept作为父表(主表)
代码:
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);
运行后,我们去删除dept表中的记录,发现不能随意去删除记录了...(因为有个emp表依赖于dept表)
删除外键
删除外键语法:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
示例如下:
发现emp表中有外键fk_emp_dept_id
删除该外键
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
运行后,查看emp建表语句,发现外键已被删除;删除dept表中记录,发现也可成功删除
外键的删除/更新行为
外键的删除/更新行为有哪些
行为 | 说明 |
NO ACTION | 当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则不允许删除/更新。(与RESTRICT一致) 注意:NO ACTION是外键约束的默认行为 |
RESTRICT | 当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则不允许删除/更新。(与NO ACTION一致) 注意:RESTRICT是外键约束的默认行为 |
CASCADE | 意思是:级联 当在父表(主表)中删除或更新对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则也删除/更新外键在子表中的记录。 |
SET NULL | 当在父表(主表)中删除对应记录时,首先应该检查该记录是否有对应的外键记录,如果有,则设置子表中对应的外键记录的值为NULL(这就要求该外键允许取NULL)。 |
SET DEFAULT | 当父表(主表)有表更时,子表将外键列设置为一个默认的值(MySQL的默认引擎Innodb不支持) |
注意:
NO ACTION和RESTRICT是外键约束的默认行为
指定外键的删除/更新行为-语法
在建立外键约束的同时,指定外键的删除/更新行为:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;
在HEIDISQL中更快捷方便的添加外键行为,如下:
案例
现有两张表,emp表和dept表
emp表数据如下:
dept表数据如下:
CASCADE(级联)-例子
需求:
- 在emp表和dept表之间建立外键约束,emp作为子表,dept作为主表(父表),emp表中的dept_id作为外键字段,对应主表dept中的id
- 指定外键约束的删除/更新行为,行为为级联:CASCADE
代码:
ALTER ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;
运行后,去更改dept表中的id,发现emp表中的dept_id会跟着更改;如果去删除dept表中的id记录,凡是emp表中有关联的dept_id的记录,一整条都会被删除
SET NULL-例子
需求:
- 在emp表和dept表之间建立外键约束,emp作为子表,dept作为主表(父表),emp表中的dept_id作为外键字段,对应主表dept中的id
- 指定外键约束的删除/更新行为,行为为: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;
运行后,去删除dept表中的id记录,emp表中对应的外键dept_id的值为NULL