【MySQL】数据库约束
个人主页:♡喜欢做梦
欢迎 👍点赞 ➕关注 ❤️收藏 💬评论
目录
✨一、数据库的约束
🌟二、数据库约束的分类
🌍 1.非空约束(NOT NULL)
1.定义
2.格式
3.示例:
列的信息可以为空:
指定列的信息不能为空:
🌎 2.DEFAULT(默认约束)
1.定义
2.格式
3.示例:
不自定义默认值:
自定义默认值:
🌏3.UNIQUE(唯一约束)
1.定义
2.格式
3.示例:
不指定列唯一:
指定uniqe:
🌍4.PRIMARY KEY(主键约束)
1.定义
2.格式
3.示例:
4.AUTO_INCREMENT(自增类型)
🌎5.FORRIGN KEY(外键约束)
1.定义
2.格式
3.示例:
编辑
🌏 6.CHECK(检查约束)
1.定义
2.格式
3.示例
💫三、总结
✨一、数据库的约束
1.什么是数据库约束?
数据库约束是关系型数据库的一个重要功能,用于确保数据的完整性、一致性和准确性(数据本身是否正确、关联关系是否正确)。数据库约束一般指定在列。
🌟二、数据库约束的分类
🌍 1.非空约束(NOT NULL)
1.定义
定义:指定表中的某列不能存储NULL值。例如:在“学生信息表”中,指定学生的姓名不能为空,确保学生基本信息的完整性。
2.格式
字段名 字段类型 not null
3.示例:
列的信息可以为空:
-- 创建学生表1:列表的列可以指定为空
mysql> create table students(-> id bigint,-> name varchar(50));
Query OK, 0 rows affected (0.05 sec)-- 查看学生表结构,NULL都为YES表示,该列学生信息可以为空
mysql> desc students;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- 插入学生信息
mysql> insert into students values(1,'张三'),(2,NULL);
Query OK, 2 rows affected (0.11 sec)
Records: 2 Duplicates: 0 Warnings: 0-- 查看插入后的学生信息表:id为2的学生信息不完整
mysql> select* from students;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | NULL |
+------+--------+
2 rows in set (0.00 sec)
指定列的信息不能为空:
-- 创建学生表2:指定其列不能为空
mysql> create table students2(-> id bigint not null,-> name varchar(50) not null);
Query OK, 0 rows affected (0.03 sec)-- 查看学生表2结构:NULL都为NO表示该列不能为空
mysql> desc students2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | | NULL | |
| name | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- 示范错例:在指定某列不能为空的情况下,插入为空的数据,会发生报错
mysql> insert into students2 values(1,'李四'),(2,null);
ERROR 1048 (23000): Column 'name' cannot be null-- 正确示范:
mysql> insert into students2 values(1,'李四'),(2,'王五');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
- 在查看表结构时,如果NULL为YES,则表示该列学生信息可以为空(NULL);如果NULL为NO,则表示该列学生信息不能为空(NULL);
- 当指定该列的值不能为空时,则表示该列学生信息不可以为空(NULL)。
🌎 2.DEFAULT(默认约束)
1.定义
定义:在没有给某列赋值是制定一个默认值。
2.格式
字段名 字段类型 default 默认值
3.示例:
不自定义默认值:
-- 给学生表1只插入id,不对name进行赋值
mysql> insert into students(id) values(3);
Query OK, 1 row affected (0.04 sec)-- id为3的name其默认值为NULL
mysql> select * from students;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | NULL |
| 1 | 老六 |
| 3 | NULL |
+------+--------+
4 rows in set (0.00 sec)
自定义默认值:
-- 重新创建学生表2,将name列的默认值设置为‘不知道’
mysql> create table students2(-> id bigint,-> name varchar(50) default '不知道');
Query OK, 0 rows affected (0.11 sec)-- 查看学生表2的表结构:其默认值为‘不知道’
mysql> desc students2;
+-------+-------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+-----------+-------+
| id | bigint(20) | YES | | NULL | |
| name | varchar(50) | YES | | 不知道 | |
+-------+-------------+------+-----+-----------+-------+
2 rows in set (0.01 sec)-- 只添加id
mysql> insert into students2(id) values(3);
Query OK, 1 row affected (0.11 sec)-- 查看结果
mysql> select* from students2;
+------+-----------+
| id | name |
+------+-----------+
| 3 | 不知道 |
+------+-----------+
1 row in set (0.00 sec)
🌏3.UNIQUE(唯一约束)
1.定义
定义:确保表中指定列的值是唯一的,当可以为空值。
2.格式
字段名 字段类型 unique
3.示例:
不指定列唯一:
-- 重建学生表1
mysql> create table students(-> id bigint,-> name varchar(50));
Query OK, 0 rows affected (0.07 sec)-- 查看表结构
mysql> desc students;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- 添加学生信息
mysql> insert into students values(1,'张三'),(2,NULL),(1,'老六');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0-- 查看学生信息:可以发现存在重复学号
mysql> select * from students;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | NULL |
| 1 | 老六 |
+------+--------+
3 rows in set (0.00 sec)
为了确保学号的唯一性,我们在id列进行指定unique。
指定uniqe:
-- 创建学生表2
mysql> create table students2(-> id bigint unique,-> name varchar(50));
Query OK, 0 rows affected (0.12 sec)-- 查看表结构:
mysql> desc students2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | YES | UNI | NULL | |
| name | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- 添加与学生表1相同的信息:可以发现当出现重复id时,会发生报错现象
mysql> insert into students2 values(1,'张三'),(2,NULL),(1,'老六');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
🌍4.PRIMARY KEY(主键约束)
1.定义
定义:NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速的找到表中的一个特定的记录。但每个表只能有一个主键。
2.格式
写法一:
字段名 字段类型 not null unique
写法二:
字段名 字段类型 primary key
3.示例:
-- 写法1
-- 重键学生表:将学生表进行主键约束
mysql> create table students(-> id bigint not null unique,-> name varchar(50) not null);
Query OK, 0 rows affected (0.15 sec)-- 查看表结构:
mysql> desc students;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)-- 写法2
-- 重建学生表2与学生表1结构相同
mysql> create table students2(-> id bigint primary key,-> name varchar(50) not null);
Query OK, 0 rows affected (0.13 sec)-- 查看表结构:
mysql> desc students2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(50) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
注意事项:
- 一个表中只能有一个主键
- 一个主键可以包含多个列(符合主键)
- 一个主键可以同时包含多个列(符合主键),但只有符合主键中的所有列相同才能是相同,也就是如果只有一列相同的值但是其他列不相同,也是不符合的。
-- 创建学生表4
mysql> create table students4(-> id bigint ,-> name varchar(50),-> primary key(id,name)); -- 设置复合主键
Query OK, 0 rows affected (0.14 sec)-- 查看表结构
mysql> desc students4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint(20) | NO | PRI | NULL | |
| name | varchar(50) | NO | PRI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- 重复插入1,'王五',两者列都相同,不符合复合主键条件,发生报错现象
mysql> insert into students4 values(1,'王五'),(1,'王五');
ERROR 1062 (23000): Duplicate entry '1-王五' for key 'PRIMARY' -- '1-王五'是复合主键的组合-- 插入元素(1,'张三')
mysql> insert into students4 values(1,'张三');
Query OK, 1 row affected (0.10 sec)-- 插入元素(1,'王五'),(2,'王五')
-- 可以发现(1,'王五')中的id值与(1,'张三')的id值相同
-- 并且(1,'王五')的name与(2,'王五')的name相同
-- 当仍然可以插入,复合主键中只要所有列没有都相同,都符合条件
mysql> insert into students4 values(1,'王五'),(2,'王五');
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0-- 查看表中数据
mysql> select * from students4;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 1 | 王五 |
| 2 | 王五 |
+----+--------+
3 rows in set (0.00 sec)
4.AUTO_INCREMENT
(自增类型)
定义:是关键字,实现自增类型,常用于整数类型字段,常用于整数类型字段,每次寻找当前插入列的最大值,在此基础上进行自增,且会自动进行排列。
-- 创建学生表5
mysql> create table students5(-> id bigint primary key auto_increment,-- 设置自增键-> name varchar(50));
Query OK, 0 rows affected (0.09 sec)-- 不写id,只添加name
mysql> insert into students5(name) values('一一'),('老三'),('老四');
Query OK, 3 rows affected (0.10 sec)
Records: 3 Duplicates: 0 Warnings: 0-- 查看列表元素:id从1开始依次自增
mysql> select * from students5;
+----+--------+
| id | name |
+----+--------+
| 1 | 一一 |
| 2 | 老三 |
| 3 | 老四 |
+----+--------+
3 rows in set (0.00 sec)-- 自定义id添加元素
mysql> insert into students5 values(7,'张三'),(9,'王五');
Query OK, 2 rows affected (0.13 sec)
Records: 2 Duplicates: 0 Warnings: 0-- 只添加name
mysql> insert into students5(name) values('李氏');
Query OK, 1 row affected (0.07 sec)-- 数据库会先找到最大值,然后在这个基础上自增生成一个新的值
mysql> select * from students5;
+----+--------+
| id | name |
+----+--------+
| 1 | 一一 |
| 2 | 老三 |
| 3 | 老四 |
| 7 | 张三 |
| 9 | 王五 |
| 10 | 李氏 |
+----+--------+
6 rows in set (0.00 sec)-- 添加元素
mysql> insert into students5 values(5,'王氏');
Query OK, 1 row affected (0.08 sec)mysql> insert into students5(name) values('张三');
Query OK, 1 row affected (0.04 sec)-- 可以发现会进行根据id进行自动排序
mysql> select * from students5;
+----+--------+
| id | name |
+----+--------+
| 1 | 一一 |
| 2 | 老三 |
| 3 | 老四 |
| 5 | 王氏 |
| 7 | 张三 |
| 9 | 王五 |
| 10 | 李氏 |
| 11 | 张三 |
+----+--------+
8 rows in set (0.00 sec)
🌎5.FORRIGN KEY(外键约束)
1.定义
定义:外键约束用于建立和加强两个表之间的关联。一个表的外键指向另一个表的主键。外键约束能够保证引用的完整性,即一个表的外键值必须存在于另一个表的主键列中。
2.格式
foreign key (字段名) references 主表(列)
3.示例:
没有建立外键约束:
-- 创建课程表(编号,课程名称)
mysql> create table course(-> id bigint primary key auto_increment,-> name varchar(20));
Query OK, 0 rows affected (0.06 sec)-- 创建学生表(学生编号,学生姓名,课程编号)
mysql> create table student(-> id bigint primary key auto_increment,-> name varchar(20) not null,-> course_id bigint);
Query OK, 0 rows affected (0.08 sec)-- 插入科目名称
mysql> insert into course(name) values('english'),('math'),('chinese');
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0-- 插入学生信息:可以发现没有建立主外键练习,即使没有该科目编号也能进行插入
mysql> insert into student(name,course_id) values('张三',2),('李四',3),('王五',5);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select* from student;
+----+--------+-----------+
| id | name | course_id |
+----+--------+-----------+
| 1 | 张三 | 2 |
| 2 | 李四 | 3 |
| 3 | 王五 | 5 |
+----+--------+-----------+
3 rows in set (0.00 sec)mysql> select * from course;
+----+---------+
| id | name |
+----+---------+
| 1 | english |
| 2 | math |
| 3 | chinese |
+----+---------+
3 rows in set (0.00 sec)
建立外键约束:
-- 课程表(主表)
mysql> create table course(-> id bigint primary key auto_increment,-> name varchar(20));
Query OK, 0 rows affected (0.06 sec)mysql> insert into course(name) values('english'),('math'),('chinese');
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0-- 学生表:建立主外键联系(从表)
mysql> create table student2(-> id bigint primary key auto_increment,-> name varchar(20) not null,-> course_id bigint,-> foreign key (course_id) references course(id)); -- 建立主外键联系
Query OK, 0 rows affected (0.13 sec)-- 查看学生表结构:MUL代表存在外键关系
mysql> desc student2;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| course_id | bigint(20) | YES | MUL | NULL | |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)-- 插入与上一段代码中相同的元素,发生报错现象:
-- 报错原因:student2中course_id是外键,引用的是course表中的id。
-- 数据库要检测插入course_id中的数据,在course表中的id是否存在,不存在则不满足外键约束
mysql> insert into student2(name,course_id) values('张三',2),('李四',3),('王五',5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`java2`.`student2`, CONSTRAINT `student2_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))-- 插入数据
mysql> insert into student2(name,course_id) values('张三',2),('李四',3),('王五',3);
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select*from course;
+----+---------+
| id | name |
+----+---------+
| 1 | english |
| 2 | math |
| 3 | chinese |
+----+---------+
3 rows in set (0.00 sec)mysql> select*from student2;
+----+--------+-----------+
| id | name | course_id |
+----+--------+-----------+
| 4 | 张三 | 2 |
| 5 | 李四 | 3 |
| 6 | 王五 | 3 |
+----+--------+-----------+
3 rows in set (0.00 sec)-- 从表中的性质与主表无关
mysql> insert into student2(name,course_id) values('赵六',null);
Query OK, 1 row affected (0.09 sec)
- 外键列的性质与被引用表中的主键列的性质并无冲突。例如:当外键列允许插入null值,与被引用表中得主键列的性质并不冲突。
- 如果要删除主表中的记录,要先查看子表中是否对该条记录有依赖,如果有依赖,需要先删除子表中的元素,否则发生报错现象。
🌏 6.CHECK(检查约束)
1.定义
定义:用于限制列的值必须满足的特定条件,可以使用逻辑表达式来定义检查约束,指定列值的取值范围、格式或其他条件。
2.格式
check(特定条件)
3.示例
-- 创建学生表
mysql> create table student3(-> id bigint,-> gender varchar(20),-> check(gender='男'or gender='女'));
Query OK, 0 rows affected (0.04 sec)-- 插入:这个记录不符合条件,插入会失败。
mysql> insert into student3 values(1,'无');
- 在mysql中,CHECK并不是在所有版本的mysql中都原生支持。从mysql 8.0,。16版本开始,mysql开始支持CHECK约束。如果你使用的是mysql 8.0.16或更高版本,你可以使用CHECK约束来确保列值满足特定条件。
💫三、总结
- NOT NULL(非空约束):指定表中的某列不能存储NULL值;
- UNIQUE(唯一约束):确保表中指定列的值是唯一的,当可以为空值;
- DEFAULT(默认约束):在没有给某列赋值是制定一个默认值;
- PRIMARY KEY(主键约束):NOT NULL和UNIQUE的结合;
- FORRIGN KEY(外键约束):外键约束用于建立和加强两个表之间的关联;
- CHECK(检查约束):用于限制列的值必须满足的特定条件。