MySQL中的约束详解

2023-12-11 10:40:44

概念

约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。

约束分类

1 主键约束

主键约束是使用最频繁的一种约束。当创建一个表时,一般情况下都要求设置一个主键。使用PRIMARY KEY 关键字表示,改字段能唯一标识表中的每条记录的,该主键字段非空且唯一。

2 非空约束

NOT NULL,限制字段数据不能为空。

例如,当我们往teacher表中插入一个辅导员名称null时(teacher表中name字段设置了非空约束):

constraint not null

3 唯一约束

UNIQUE,保证该字段下的数据都是唯一的,不重复的。

例如,在teacher表中,name字段被赋予唯一约束,插入一条表中已经存在的name:

constraint not null

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,就会报错。

constraint not null

添加外键约束方式:

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;

外键删除/更新行为

  1. NO ACTION

当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则不允许删除/更新。

  1. RESTRICT

当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则不允许删除/更新。

  1. CASCADE

当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则也删除/更新外键在子表中的记录。

  1. SET NULL

当在父表中删除更新对应记录时,首先检查该记录中是否有对应外键,如果有,则设置子表中该外键值为null(首先要求该外键值允许设置为null)。

  1. 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;

目录

相关推荐
MySQL入门-什么是MySQL,什么是SQL超详细的 SQL 语句 DDL(数据定义语言)讲解MySQL中如何对表字段进行增加、删除、改名、类型修改SQL语句-DML(数据操作语言)对表记录的插入、更改、删除命令超详细的DQL(数据查询语言)讲解