【MySQL】一文带你了解数据库约束

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】一文带你了解数据库约束

1. 约束类型

作用:

数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。

常见的数据库约束包括:

主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。

外键约束:用于确保表之间数据的关系正确性,保证引用表中的数据必须存在于被引用的表中。

非空约束:用于确保列中的值不为空。

唯一约束:用于确保列中的值不重复。

默认约束:用于设置默认值,当插入数据时如果未提供该值,则数据库将使用默认值。

检查约束:用于确保列中的值符合特定的条件或表达式。

触发器约束:用于在特定情况下自动执行操作,如插入或删除数据时执行某项操作。


2.PRIMARY KEY:主键约束

概念:

主键约束是一种用于限制表中唯一标识每行记录的数据库约束。主键约束可以确保表中每行的唯一性,并且可以作为其他表与该表之间关系的依据。每个表只能有一个主键约束,主键约束的值必须是唯一的且不为空。

主键约束可以在创建表时定义,也可以在已有表上添加。

举例:

1.在创建一个名为"student"的表时,可以给"id"列定义主键约束。

0e3efffadf3341c3a7ed1d4b8f76fd1b.png

这个时候,当我们添加元素的时候,id的值就必须唯一并且不为空。

8e0232bf260e4152ad054d07e3973fd4.png

>2.当表已经创建好,表中并没有任何一列进行主键约束,我们还可以通过下面这种方式进行主键约束。

4bd2bb48a8ad40c5a277e98acbe4e251.png

注意

这种约束方式并不如前者,而且当想要约束的列,有null或者有重复元素的时候,会主键约束失败。

2ce5710fd52c4ada887f2883c1b39312.png


上面用到的代码:

mysql> create table student(id int primary key, name varchar(10));
Query OK, 0 rows affected (0.02 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into values(null,'张三');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(null,'张三')' at line 1
mysql> insert into student values(null,'张三');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student values('张三');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(1,'李四');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into student values(2,'李四');
Query OK, 1 row affected (0.01 sec)
mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 | 张三 |
|  2 | 李四 |
+----+------+
2 rows in set (0.00 sec)


3.FOREIGN KEY:外键约束

概念:

外键约束是一种用于保持表之间数据一致性的约束,它建立了两个表之间的一对多关系。外键约束确保了一个表中的数据必须和另一个表中的数据相关联,否则就会触发约束错误。

外键约束也可以在创建表时定义或者在已有表上添加。

举例:

外键约束也可以在创建表时定义或者在已有表上添加。

下图定义了一个外键约束:

55cb3daae87b43779547ba19178089d3.png

外键约束通常用于将两个表之间建立一对多关系,上面图中,student表中的class_id列是一个外键,它关联到了class表中的id列。这个外键约束确保student表中的class_id列的值只能从class表中的id列中的值中选择,如果没有,则报错。

1a6da830fb064d1dbffa995dd1289791.png


上面用到的代码:

mysql> create table class(id int primary key, name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> create table student(id int primary key, name varchar(20), class_id int,
    -> foreign key (class_id) references class(id));
Query OK, 0 rows affected (0.02 sec)
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| class_id | int(11)     | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into class values(1, '软件工程'),(2, '计科');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> insert into student values(20211,'张三',1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(20212,'李四',2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(20213,'王五',3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xiaoc`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))


4.NOT NULL:非空约束

概念:

非空约束是一种用于确保列中的值不为空的约束。如果为某个列定义了非空约束,那么在插入或更新数据时必须为该列提供一个非空值,否则就会触发非空约束错误。

举例:

在创建表时,可以为某个列定义非空约束。

下面的代码定义了一个名为student的表,其中的id列被定义为非空约束:

2dd20f94f5dd43d1861e3a05f4926f72.png

这个时候如果插入空的元素就会报错。

df58a4dbdef745c9b0126c7f5e9f2b8a.png


上面用到的代码:

mysql> create table student(id int not null, name varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(null,'李四');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student values('李四');


5.UNIQUE:唯一约束

概念:

唯一约束是一种用于确保某个列中的值唯一的约束。如果为某个列定义了唯一约束,那么该列中的值必须是唯一的,不允许有重复值。唯一约束可以用于确保表中某一列或多列的组合中没有重复值。

举例:

在创建表时,可以为某个列定义唯一约束。

下面的代码定义了一个名为users的表,其中的email列被定义为唯一约束:

4c8c0dc24e904250b0d49ddf96e3caea.png上述例子中,student表中的id列被定义为唯一约束,因此,任何向student表插入数据的操作,都必须确保id列中的值是唯一的。

adb63385f1104a258a3ff9fd31ead263.png

上面用到的代码:

mysql> create table student(id int unique,name varchar(20));
Query OK, 0 rows affected (0.02 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | UNI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(2,'李四');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student values(2,'威威');
ERROR 1062 (23000): Duplicate entry '2' for key 'id'


5.DEFAULT:默认值约束

概念:

默认值约束是指在向表中插入新行时,如果没有为某个列指定具体的值,则该列会使用预定义的默认值。默认值可以是任何常量或表达式,例如字符串、数字、日期等。如果某个列定义了默认值约束,则在执行INSERT操作时,如果没有为该列指定具体值,则会自动使用默认值。

举例:

在创建表时,可以为某个列指定默认值约束。例如,下面的代码创建了一个名为student的表,其中的name列被定义为默认值约束:

57384d41247a4b7b91f8c8d62a9ff5bc.png

当插入null.

0ba58f82d85248c5b97b006af4227ff5.png


上面用到的代码:

mysql> create table student(id int, name varchar(10) default '陌路人');
Query OK, 0 rows affected (0.02 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | 陌路人  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into student(id) values(1),(2);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> insert into student values(3,'张三');
Query OK, 1 row affected (0.01 sec)
mysql> select * from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 陌路人 |
|    2 | 陌路人 |
|    3 | 张三   |
+------+--------+
3 rows in set (0.00 sec)


6.总结

数据库约束是数据库设计中的重要概念,它可以有效地保障数据的完整性、一致性、准确性和安全性,帮助开发人员更好地管理和维护数据,所以掌握约束还是非常重要的。

以上就是常用的约束,下次见!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
20 4
|
5天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
14 1
|
13天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
70 1
|
1天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
16 0
|
14天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
45 0
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
188 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
139 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
|
存储 SQL 关系型数据库
MySQL---数据库从入门走向大神系列(五)-存储过程
MySQL---数据库从入门走向大神系列(五)-存储过程
138 0
MySQL---数据库从入门走向大神系列(五)-存储过程
|
数据库
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
200 0
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
210 0
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查