MySQL中的约束详解
2023-12-11 10:40:44概念
约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。
约束分类
1 主键约束
主键约束是使用最频繁的一种约束。当创建一个表时,一般情况下都要求设置一个主键。使用PRIMARY KEY 关键字表示,改字段能唯一标识表中的每条记录的,该主键字段非空且唯一。
2 非空约束
NOT NULL,限制字段数据不能为空。
例如,当我们往teacher表中插入一个辅导员名称null时(teacher表中name字段设置了非空约束):
3 唯一约束
UNIQUE,保证该字段下的数据都是唯一的,不重复的。
例如,在teacher表中,name字段被赋予唯一约束,插入一条表中已经存在的name:
4 默认约束
DEFAULT, 未指定改字段的值时,会使用默认值。
如果字段被设置了默认值,那么当进行insert into命令时,可以不传入值。
5 检查约束
CHECK(条件),保证字段值满足一条件,8.0.16版本后支持。
6 外键约束
FOREIGN KEY 关键字
外键约束是用来让两张表之间建立一种连接,保证数据的一致性和完整性。
约束条件应用
创建一个student表,要求:
- id:主键、自增
- name:varchar(10)、唯一值、不能为空,表示学生姓名
- age:int 大小在1到30岁之间,表示学生年龄
- gender:int(1) 默认是1,表示学生性别,1表示男,0表示女生
CREATE table student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT("主键id"),
name VARCHAR(10) UNIQUE NOT NULL COMMENT("学生名称"),
age INT CHECK(age >= 1 && age <== 30) COMMENT("学生年龄"),
gender INT(1) DEFAULT 1 COMMENT("学生性别,1表示男生,0表示女生,默认男生")
);
外键约束应用
首先,我们创建student表和teacher表,并通过外键约束方式建立一种连接:
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name varchar(10) UNIQUE NOT NULL COMMENT "学生名称",
age INT COMMENT "学生年龄",
teacher_id INT NOT NULL COMMENT "学生辅导员id",
score INT COMMENT "学生分数"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO
student (name, age, teacher_id, score)
VALUES
("李红", 20, 1, 80),
("刘涛", 10, 1, 90),
("王武", 19, 2, 80),
("李明", 18, 2, 90),
("李小明", 15, 2, 99);
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name VARCHAR(10) UNIQUE NOT NULL COMMENT "辅导员名称"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teacher (name) VALUES ("王老师"), ("蒋老师");
ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(id);
添加外键约束和未添加之前有什么区别呢?
如果我们不进行外键约束,那么当我们删除teacher表中的一条记录时,会提示删除成功,并不会影响student表中的teacher_id。
如果我们建立了一种外键约束,删除时,如果在student表中记录有这个被删除的teacher_id,就会报错。

添加外键约束方式:
1. 创建表时,添加外键
语法如下:
CREATE TABLE 表名 ( 字段名 类型 约束条件 ..., [CONSTRAINT 外键名称] FOREIGN KEY (字段名 [,字段名2,…]) REFERENCES 主表名 (主键列1 [,主键列2,…]) );
注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 int 类型,或者都是 char 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can’t create table”错误。
举例:
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name varchar(10) UNIQUE NOT NULL COMMENT "学生名称",
age INT COMMENT "学生年龄",
teacher_id INT NOT NULL COMMENT "学生辅导员id",
score INT COMMENT "学生分数",
CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 通过alter命令
语法如下:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表字段名);
注意:在为已经创建好的数据表添加外键约束时,要确保添加外键约束的列的值全部来源于主键列,并且外键列不能为空。
举例:
ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(id);
删除外键约束
语法如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
举例:
ALTER TABLE student DROP FOREIGN KEY fk_teacher_id;
外键删除/更新行为
- NO ACTION
当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则不允许删除/更新。
- RESTRICT
当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则不允许删除/更新。
- CASCADE
当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
- SET NULL
当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则设置子表中该外键值为null(首先要求该外键值允许设置为null)。
- SET DEFAULT
父表有变更时,子表将外键设置为一个默认的值(InnoDB不支持)。
如何设置呢?
CREATE TABLE 表名 ( 字段名 类型 约束条件 ..., [CONSTRAINT 外键名称] FOREIGN KEY (字段名 [,字段名2,…]) REFERENCES 主表名 (主键列1 [,主键列2,…]) ON UPDATE RESTRICT ON DELETE CASCADE );
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表字段名) ON UPDATE RESTRICT ON DELETE CASCADE;