🎉博主首页: 有趣的中国人
🎉专栏首页: 数据库初阶
亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL中表的约束 帮助您轻松入门,快速掌握核心概念。
如果文章对您有所启发或帮助,请别忘了 点赞 👍、收藏 🌟、留言 📝 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!
### 文章目录
- [@[toc]](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`0. 什么是表的约束`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`1. NULL & NOT NULL`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧1.1 关键词解释🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧1.2 用法示例🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`2.DEFAULT`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧2.1 关键词解释🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧2.2 用法示例🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧2.3 NOT NULL 和 DEFAULT 区别🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`3.COMMENT`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧3.1 关键词解释🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧3.2 用法示例🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`4.ZEROFILL`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧4.1 关键词解释🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧4.2 用法示例🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [`5. PRIMARY KEY`](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧5.1 关键词解释🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [🎧5.2 用法示例🎧](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [5.2.1 单列主键](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键) - [5.2.2 复合主键](#文章目录 @[toc]
0. 什么是表的约束
1. NULL & NOT NULL
🎧1.1 关键词解释🎧 🎧1.2 用法示例🎧2.DEFAULT
🎧2.1 关键词解释🎧 🎧2.2 用法示例🎧 🎧2.3 NOT NULL 和 DEFAULT 区别🎧3.COMMENT
🎧3.1 关键词解释🎧 🎧3.2 用法示例🎧4.ZEROFILL
🎧4.1 关键词解释🎧 🎧4.2 用法示例🎧5. PRIMARY KEY
🎧5.1 关键词解释🎧 🎧5.2 用法示例🎧 5.2.1 单列主键 5.2.2 复合主键)
上一篇文章中,博主介绍了 :
- MySQL中不同的数据类型
建议将上一篇文章看完之后再来看这篇文章,链接如下:
那么接下来正文开始:
0. 什么是表的约束
- 上一篇文章中讲过,真正表的约束其实是 数据类型;
- 但是数据类型约束很单一,需要有一些 额外的约束 ,更好的保证 数据的合法性 ,从业务逻辑角度 保证数据的正确性。
- 表的约束有很多,本篇文章主要介绍以下几个:
null / not null,
default,
comment,
zerofill,
primary key,
auto_increment,
unique key
1. NULL & NOT NULL
🎧1.1 关键词解释🎧
NULL
就是空,什么都没有的意思,和语言上的NULL
是有点区别的;- 在数据库创建中,如果从逻辑角度不想让某一个字段(某一列)为空,就要添加约束条件,
NOT NULL
。
🎧1.2 用法示例🎧
- 例如,在学校中,从逻辑上讲,每个学生的学号都不可能是空值;
- 因此可以将这个字段添加约束
NOT NULL
; SQL
代码如下:
sql
mysql> create table if not exists null_test(
-> stu_id varchar(10) not null,
-> stu_name varchar(10),
-> stu_class int
-> );
- 查看一下表结构,输入:
desc null_test;
- 此时,必须在这个表中的每一行添加这个字段的值,不然就会报错:
2.DEFAULT
🎧2.1 关键词解释🎧
- 在一张表中,某一个字段的值可能 出现的频率比较高;
- 为了避免重复的输入,可以将这个字段添加约束
DEFAULT
默认值; - 下次就不需要手动进行插入,会自动添加到表中;
- 如果某一行中此字段的值不是默认值,再手动修改,大大提高了效率。
🎧2.2 用法示例🎧
- 例如,在理工类学校中,男生的人数可能比女生的人数要多很多;
- 那么就可以将性别这个字段添加默认值;
- 代码如下:
sql
mysql> create table if not exists default_test(
-> stu_id int not null,
-> gender char(1) default '男',
-> age int unsigned
-> );
Query OK, 0 rows affected (0.05 sec)
- 查看表结构:
- 省略
gender
字段向表中插入数据,那就是默认值,不省略就可以修改:
🎧2.3 NOT NULL 和 DEFAULT 区别🎧
问题1:
- 先来看下面的一个插入方式,为什么在创建的时候
age
字段没有设置默认值,插入的时候也可以被省略?
- 实际上,对于不是
NOT NULL
的字段,MySQL
会自动帮我们添加 默认值NULL
,我们可以查看一下MySQL
为我们修改的创建表的语法:
问题2:
- 我们可以看到:非空约束的默认值也是
NULL
,为什么呢?
- 其实这个
NULL
的本质是不一样的,如果我们不指定stu_id
列插入数据看一下:- 可以看到,这里的报错是 没有默认值报的错。
- 如果我们指定了这个列,但是插入的是空值看一下:
- 注意到,这里的报错是 此列不能是空报的错。
- 因此,在定义非空约束的表中,
MySQL
不会帮我们自动生成一个默认值; - 对于带有
NOT NULL
约束的字段,DESC
中显示的Default
为NULL
,这并不表示这个字段的默认值是NULL
。实际上,NOT NULL
约束要求这个字段在插入时不能是NULL
,如果插入时没有提供这个字段的值,MySQL
会报错,报的是没有默认值的错误。
总结:
-
对于是非空约束的字段:
MySQL
不会帮我们自动生成一个默认值,如果我们在插入数据的时候不显示指定此列,那么编译器就会报没有默认值的错误;- 如果插入数据的时候显示插入值,但是插入的值是
NULL
,才会报自此段不能为空的错误。
-
对于不是非空约束的字段:
MySQL
会自动帮我们生成一个默认值NULL
,所以不会报没有默认值的错误。- 因为只有设置了
default
的列,才可以在插入值的时候,对列进行省略。
-
一般情况下,
default
约束和not null
约束不会一起使用。
3.COMMENT
🎧3.1 关键词解释🎧
comment
表示列描述,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;
🎧3.2 用法示例🎧
- 创建一个表,描述各个列的含义;
- 代码如下:
sql
mysql> create table if not exists comment_test(
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 18 comment '年龄',
-> gender char(1) default '男' comment '性别'
-> );
Query OK, 0 rows affected (0.08 sec)
desc
是查不到注释信息的:
- 通过
show create table
可以看到:
4.ZEROFILL
🎧4.1 关键词解释🎧
- 还记得在上一篇文章中讲的数据类型
int
吗,在查表的时候后面的数字代表着什么呢? - 其实没有这个
zerofill
属性,这个数字是没有意义的; - 其实这个表示最后用统一的字数显示,如果是 10 10 10,那么最后就是显示 10 10 10位数字,如果实际数字少于 10 10 10 位,就用 0 0 0 补齐,如果多出就不管。
🎧4.2 用法示例🎧
- 创建一个表,里面只有
int
,一个int(5)
,另一个int(10)
这个用zerofill
约束; - 代码如下:
sql
mysql> create table if not exists zerofill_test(
-> a int(5),
-> b int(10) unsigned zerofill
-> );
- 插入数据,代码如下:
sql
mysql> insert into zerofill_test values(1,2);
Query OK, 1 row affected (0.01 sec)
mysql> insert into zerofill_test values(325, 510);
Query OK, 1 row affected (0.01 sec)
- 查表:
sql
mysql> select * from zerofill_test;
+------+------------+
| a | b |
+------+------------+
| 325 | 0000000510 |
| 1 | 0000000002 |
+------+------------+
2 rows in set (0.00 sec)
- 其实
int
默认是 10 10 10 位也是有原因的,因为它的最大值就是二十一亿多( 10 10 10 位数字),unsigned
也就是四十二亿多( 10 10 10 位数字)。
5. PRIMARY KEY
🎧5.1 关键词解释🎧
primary key
用来 唯一的 约束该字段里面的数据,不能重复,不能为空 ;- 主键要求表中每一行记录的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。
- 主键字段不能为
NULL
。也就是说,在定义主键时,MySQL
会自动给该字段添加NOT NULL
约束。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。
- 一张表中最多只能有 一个主键 ,但可以由一个列或多个列组成(复合主键)。
- 主键可以由一列或多列字段组成。一个单列主键称为"单列主键",而由多个列组成的主键称为"复合主键"。
- 单列主键:表中只有一个字段作为主键。
- 复合主键 :多个字段组合成一个主键,保证唯一性。
- 主键可以由一列或多列字段组成。一个单列主键称为"单列主键",而由多个列组成的主键称为"复合主键"。
- 主键所在的列通常是 整数类型。
🎧5.2 用法示例🎧
5.2.1 单列主键
- 可以用以下两种方式定义主键:
sql
#方法1:
mysql> create table if not exists primarykey_test(
-> stu_id int,
-> name varchar(20),
-> gender char(2) default '男',
-> primary key(stu_id)
-> );
Query OK, 0 rows affected (0.04 sec)
# 方法2:
mysql> create table if not exists primarykey_test(
-> stu_id int primary key,
-> name varchar(20),
-> gender char(2) default '男',
-> );
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息:
- 发现自动添加了
NOT NULL
约束。
- 发现自动添加了
- 插入信息,发现如果有了主键约束,此列信息不能重复:
- 可以删除主键,代码如下:
sql
mysql> alter table primarykey_test drop primary key;
Query OK, 1 row affected (0.16 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> desc primarykey_test;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 删除后可以重新添加,但要 保证添加这一列中没有重复的值!!
sql
mysql> alter table primarykey_test add primary key(stu_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc primarykey_test;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | char(2) | YES | | 男 | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
5.2.2 复合主键
- 定义方法,代码如下:
- 这个表中定义主键的意思是一个学生可以选择多门课,一门课可以被多名学生选择,但是 不存在一名学生重复选择同样的课的情况。
sql
mysql> create table if not exists primarykey_test2(
-> stu_id int,
-> course_id int,
-> grade int,
-> primary key(stu_id, course_id)
);
Query OK, 0 rows affected (0.04 sec)
- 查看创建信息和表结构:
主键的特点与约束:
- 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
- 如果表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。