当前位置: 首页 > news >正文

【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(检查约束):用于限制列的值必须满足的特定条件。

相关文章:

  • 5.Chromium指纹浏览器开发教程之编译发布版本
  • 前沿篇|CAN XL 与 TSN 深度解读
  • 从零开始学A2A四:A2A 协议的高级应用与优化
  • Rocky8 升级 Python 3.9.20 并部署 Airflow 2.10.5
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题
  • VASP 6.4.1 Ubuntu系统编译安装手册
  • 刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程
  • 【Linux】【阿里云服务器】【树莓派】学习守护进程编程、gdb调试原理和内网穿透信息
  • 接口自动化测试(二)
  • 【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南
  • 大模型时代:AI应用的变革与挑战
  • Linux系统之----冯诺依曼结构
  • AI编程方法第五弹:测试很重要
  • 智谱AI大模型免费开放:开启AI创作新时代
  • docker镜像被覆盖了怎么办?通过sha256重新上传镜像
  • 第 7 期:DDPM 采样提速方案:从 DDPM 到 DDIM
  • 【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)
  • zset.
  • 《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式
  • 容性串扰-信号与电源完整性分析
  • 人民网评:“中国传递爱而不是关税”
  • 95后男中音胡斯豪敲开芝加哥抒情歌剧院大门
  • 行拘!如此引流诱导违法犯罪不该被纵容
  • 轻流科技薄智元:AI时代,打造“工业智造”需要“共生式进化”
  • 皓元医药郑保富:共创、共赢、共享,跨域协作推动生物医药创新
  • 不断深化“数字上海”建设!上海市数据发展管理工作领导小组会议举行