【MySQL】表的约束

目录

🌈前言🌈

[📁 概念](#📁 概念)

[📁 空属性](#📁 空属性)

[📁 默认值](#📁 默认值)

[📁 zerofill](#📁 zerofill)

[📁 列描述](#📁 列描述)

[📁 主键](#📁 主键)

[📁 自增长](#📁 自增长)

[📁 唯一键](#📁 唯一键)

[📁 外键](#📁 外键)

[📁 总结](#📁 总结)


🌈前言🌈

本期【MySQL】主要讲解表的约束,包括什么是约束,有哪些约束,这些约束有什么作用等内容,掌握以上内容,你就可以基本掌握如何正确的创建表,以及确保表中数据的正确性和完整性。

📁 概念

在我们初次学习数据库表的时候,创建表时一定了解过什么是数据类型,数据类型其实也是一个约束。

表的约束是数据库设计中用于确保数据完整性、准确性和一致性的重要机制。它们通过对表中的行或列的数据进行限制来实现这一目标。

即通过技术手段使得我们数据库中的数据一定是可预期的和完整的。因此如果我们想要尽可能的多的保证数据的可预期性,正确性和完整性,就要需要尽可能多的约束条件。

例如,我们的生活中,身份证号码是唯一的,因此在数据库中我们就需要使用约束来确保身份证号码的唯一性,即不能有重复的身份证号码。

表的约束有很多,这篇文章主要介绍下面这几种:null/not null、default、comment、zerofill、primary key、auto_increment、unique key。

📁 空属性

空属性里面有两个值,nullnot null 。在MySQL中,null和空串不是一个东西。MySQL中,如果插入数据时,不给值的话值默认是null,null是不参与运算的

如果我们想要用户插入数据时,必须插入数据,就可以在数据类型后面+not null,就表示保证字段不能为空。

sql 复制代码
mysql> insert into Student values(1,1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into Student values(1);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

mysql> insert into Student values(1,null);
ERROR 1048 (23000): Column 'class_id' cannot be null

mysql> select * from Student;
+------+----------+
| id   | class_id |
+------+----------+
|    1 |        1 |
+------+----------+
1 row in set (0.00 sec)

上述代码中,class_id是不能为空的,因此我们往表中插入数据时,没有数据或者数据为null时,MySQL会报错,不能往表中插入数据。

📁 默认值

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

sql 复制代码
mysql> create table test( id int, age int default  18);
Query OK, 0 rows affected (0.05 sec)

mysql> desc test;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
| age   | int  | YES  |     | 18      |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.01 sec)

上面的代码我们将age的默认值设为18,如果插入数据时没有显示的插入age的数据,该行age的参数会被设置为18。

sql 复制代码
mysql> insert into test value(1,1);
mysql> insert into test(id) value(2);

mysql> select * from test;
+------+------+
| id   | age  |
+------+------+
|    1 |    1 |
|    2 |   18 |
+------+------+
2 rows in set (0.00 sec)

📁 zerofill

在学习数据库中数据类型时,int括号内的数字到底什么意思,为什么默认是int(10)呢?()内的数据就与zerofill约束有关了。

这个数值就是用来设定显示宽度的。例如int(3),插入数据1,那么正常显示是1,如果添加了zerofill显示为001,即zerofill的作用就是用0填充剩余位。

sql 复制代码
mysql> create table test(
    -> id int(5) zerofill);

mysql> insert into test value(1);

mysql> select * from test;
+-------+
| id    |
+-------+
| 00001 |
+-------+
1 row in set (0.00 sec)

📁 列描述

列描述comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

只有通过show命令来显示。

sql 复制代码
mysql> create table test( id int(5) comment '用户的身份号码');

mysql> desc test;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+

mysql> show create table test\G;
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int DEFAULT NULL COMMENT '用户的身份号码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

📁 主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空 ,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

类似于我们学习的map,key-value模型,通过key值来确定value一样。通过某个属性,来索引找到具体的某一行记录。

通过主键,我们就可以快速定位某一行记录,进行增删查改等操作了。

主键可以在创建表的时候,设定好某个属性为主键。

sql 复制代码
mysql> create table test( id int primary key);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into test value(1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test value(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'test.PRIMARY'

mysql> insert into test value(NULL);
ERROR 1048 (23000): Column 'id' cannot be null

如果你还没没有开始使用数据库,并且表中没有主键,那你也可以在设置主键。

sql 复制代码
alter table 表名 add primary key(字段列表)

但一定要注意最好创表的时候设置主键,如果使用后的表,再添加主键,就会导致有主键重复的记录,无法选择删除哪一个的业务问题。

也可以删除删除主键:

cpp 复制代码
 alter table test drop primary key;

复合键:在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键 ,可以使用复合主键。

📁 自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

sql 复制代码
mysql> create table test( id int primary key auto_increment,name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test value(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test(name) value('李四');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test value(1000,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test(name) value('王五');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
|    2 | 李四   |
| 1000 | 张三   |
| 1001 | 王五   |
+------+--------+
4 rows in set (0.00 sec)

自增长是从最大值之后开始增长。

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)

  2. 自增长字段必须是整数

  3. 一张表最多只能有一个自增长

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

📁 唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

主键用来找到表中唯一的那一行记录,唯一键用来确保该列中数据时唯一的。例如在学校我们有学号,也有身份证件号,我们使用学号作为主键来找到学生,但是学生本身的身份证件号是唯一的,因此就用唯一键来标识。

sql 复制代码
mysql> create table student (
-> id char(10) unique comment '学号,不能重复,但可以为空',
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student(id, name) values('01', 'aaa');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student(id, name) values('01', 'bbb'); --唯一约束不能重复
ERROR 1062 (23000): Duplicate entry '01' for key 'id'
mysql> insert into student(id, name) values(null, 'bbb'); -- 但可以为空
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+------+------+
| id | name |
+------+------+
| 01 | aaa |
| NULL | bbb |
+------+------+

📁 外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

我们往往不知有一张表,而往往我们是通过某种属性(在别的表是主键或者唯一键)来查找另一张表上的信息。

如果我们没有外键约束,那么两张表就无法建立联系,因此在一张表上的增删查改就无法影响另一张表,导致出错。

例如我们在班级表中,删除id=10的班级,如果class_id不是外键,那么MySQL就会删除这个班级,但是这个班级还有学生呀,不能满足业务处理。因此就需要外键的约束。

sql 复制代码
先创建主键表
create table myclass (
id int primary key,
name varchar(30) not null comment'班级名'
);

再创建从表
create table stu (
id int primary key,
name varchar(30) not null comment '学生名',
class_id int,
foreign key (class_id) references myclass(id)
);

正常插入数据
mysql> insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
mysql> insert into stu values(102, 'wangwu',30);
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (mytest.stu, CONSTRAINT stu_ibfk_1
FOREIGN KEY (class_id) REFERENCES myclass (id))

插入班级id为null,比如来了一个学生,目前还没有分配班级
mysql> insert into stu values(102, 'wangwu', null);

📁 总结

以上就是本期内容了,主要介绍了约束是什么,常见的约束有哪些,以及这些约束有什么作用,其中配备了大量的代码以供参考。

如果感觉本期内容对你有帮助,欢迎点赞,关注,收藏Thanks♪(・ω・)ノ

相关推荐
NineData1 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL2 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king5 小时前
入门 java 和 数据库
java·数据库·后端
jiayou648 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云9 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
NineData20 小时前
NineData 迁移评估功能正式上线
数据库·dba
tingshuo291720 小时前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师1 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip