您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL 主键约束、非空约束、唯一约束

时间:2021-10-18 12:26:09  来源:  作者:郑大钱呀

1.1 什么是约束

约束字面意思就是限制,比如我们每一个人的身份证号都是唯一的,不可能出现两个人,身份证是一样的,那么这里的唯一性我们就称之为一种约束,再比如:我们每个人都是有性别的,或男或女或其他,不可能出现一个人他没有性别,那么这里的不能为空同样也是一种约束。在数据库中也有很多约束,数据库的数据必须要满足约束才可正确插入,否则就会报错,下面我们具体学习约束的内容

1.2主键约束

1.2.1 主键约束

主键约束(PRIMARY KEY),简称主键,该约束的作用是定义一个主键来唯一确定表中每一行数据的标识符,我们把它拆解开来说:

  • 使用了主键的字段的值,必须是唯一的,不能重复
  • 主键的列,不能包含NULL值
  • 每个表最多只能有一个主键。

1.2.2 添加主键约束

创建表时,声明主键,示例代码如下:

CREATE TABLE People(
id int PRIMARY KEY,
name VARCHAR(30),
age INT
);

创建完成后,我们看一下People表的表结构,如下:

MySQL> desc People;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> 

这里我们发现id字段在NULL列的值为NO,在KEY列有个PRI键,这个就表示该字段为主键,下面我们试一下,如果我们插入数据时,主键字段为空,报什么错,报错如下:

mysql> insert into People(id,name,age) values(NULL,"张三",'20');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> 

从上面的报错我们可以看出主键不能为空,为空就会报上面的错,下面我们再来验证一下主键id字段不能重复,代码如下:

mysql> insert into People(id,name,age) values(1,"张三",'20');
Query OK, 1 row affected (0.01 sec)

mysql> insert into People(id,name,age) values(1,"张三",'20');
ERROR 1062 (23000): Duplicate entry '1' for key 'people.PRIMARY'
mysql> 

我们最开始插入了一条数据,然后我们又插入了一遍,发现报错了,提示id的值重复了,主键是不能重复的。

1.2.3 联合主键

我们上面的主键为id,即只需要一个字段就可以标识数据的唯一性,有的时候我们的表需要两个及以上的字段组合起来,才能确定一条记录的唯一性,举个例子,假如我们要设计一张统计一个地区学生信息的表,一个地区有多个学校,每个学校都有自己的编号,而每个学校的学生有自己的学校,当我们想要确定这个地区的某个学生时候,单单使用学号是无法确定的,因为有多个学校,学号肯定有重复的,此时我们就需要学校和学生学号两个字段才能准确确定一个学生,这个时候就需要将这两个字段设置成联合主键。联合主键还是一个主键,只不过这个主键是由多个字段共同确定的。

示例代码如下:

CREATE TABLE AreaStuInfo(
sch_no INT,
stu_no INT,
name VARCHAR(30),
CONSTRAINT pk_sch_stu_id PRIMARY KEY (sch_no,stu_no)
);

这个时候,我们再查询一下表结构,结果如下:

mysql> DESC AreaStuInfo;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sch_no | int         | NO   | PRI | NULL    |       |
| stu_no | int         | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

从上面的结果我们发现,sch_no和stu_no两个字段的KEY列的值都有PRI,也就意味着sch_no和stu_no两者的值一样,就会触发约束,报错,但是如果仅仅是这两个列的某一个列的值一样,它是不会报错。

1.2.4 删除主键约束

当我们不需要主键约束的时候,我们可使用如下的代码,将某一张的主键删除,语法如下:

ALTER TABLE 表名 DROP PRIMARY KEY;

示例代码如下:

mysql> DESC AreaStuInfo;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sch_no | int         | NO   | PRI | NULL    |       |
| stu_no | int         | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> ALTER TABLE AreaStuInfo DROP PRIMARY KEY;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC AreaStuInfo;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sch_no | int         | NO   |     | NULL    |       |
| stu_no | int         | NO   |     | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> 

1.2.5 自动增长列

我们有的时候,希望表的某一个字段的值是自动增长的,比如编号,从1开始,依次+1,在数据库中,我们可以使用auto_increment自动增长列关键字来实现,数据库会自动生成该字段的值默认开始的值是1,我们也可以修改起始值,语法如下:

ALTER TABLE 表名 AUTO_INCREMENT=值

此外值得注意的是,如果一个字段是自动增长的列,那么该字段的数据类型必须是整型且必须是主键,下面我们看一个示例:

CREATE TABLE `People` (
  `id` int PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int DEFAULT NULL
);

我们看一下表结构:

mysql> desc People;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我们有自动增长列的表中插入数据的时候,可以不为id字段设置值,也可以为其设置成null,示例代码如下:

mysql> insert into People(name,age) values("王二",20);
Query OK, 1 row affected (0.01 sec)

mysql> insert into People(id,name,age) values(Null,"李四",20);
Query OK, 1 row affected (0.00 sec)

mysql> select * from People;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 王二   |   20 |
|  2 | 李四   |   20 |
+----+--------+------+
2 rows in set (0.00 sec)

mysql> 

从上面的示例上我们可以看出,我们即使没有指定id字段的值,也是不会报错的,数据库会自动为其生成值。

1.3 非空约束

所谓非空的约束,其实很简单,如果那个字段的值添加了非空的约束,那么这个字段的值就不能为NULL,如果是NULL,就会报错,示例代码如下:

mysql> desc People;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    |                |
| sex   | char(30)    | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert into People(name,age,sex) values('张三',29,NULL);
ERROR 1048 (23000): Column 'sex' cannot be null
mysql> 

我们从通过查询People的表结构发现,sex字段不能为空,当我们在插入数据的时候,如果把该字段插入一个空值,那么就会报错。添加非空约束的语法如下,只需要在需要添加的字段后面,增加NOT NULL即可。示例代码如下:

CREATE TABLE `People` (
  `id` int PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int DEFAULT NULL,
 `sex` CHAR(30) NOT NULL
);

1.4 唯一约束

唯一约束也很简单,就是字面意思,如果一个字段被添加了唯一约束,那么该字段的值就只能是唯一的,不可重复的,添加唯一约束方式也很简单,直接在数据类型的后面加上UNIQUE关键字即可,示例代码如下:

CREATE TABLE `Person` (
  `id` int PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(30) UNIQUE,
  `age` int 
);

以我们这里的Person表为例,所有数据的名字都不能重复,如果重复则会报错,示例如下:

mysql> desc person;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | YES  | UNI | NULL    |                |
| age   | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> insert into person(name,age) values("张三",20);
Query OK, 1 row affected (0.00 sec)

mysql> insert into person(name,age) values("张三",20);
ERROR 1062 (23000): Duplicate entry '张三' for key 'person.name'
mysql> 

但是这个唯一约束对一个值例外,就是NULL,在MySQL中,NULL与任意一个值都不相等,连和它自己都不相等,多以如果名称这一列有多条记录,但是它的值是空的,也是不会报错的。

1.5 结尾

本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注、转发、收藏,谢谢。



Tags:MySQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  Tags: MySQL  点击:(6)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Tags: MySQL  点击:(31)  评论:(0)  加入收藏
数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCH...【详细内容】
2021-11-04  Tags: MySQL  点击:(37)  评论:(0)  加入收藏
1.1 什么是约束约束字面意思就是限制,比如我们每一个人的身份证号都是唯一的,不可能出现两个人,身份证是一样的,那么这里的唯一性我们就称之为一种约束,再比如:我们每个人都是有性...【详细内容】
2021-10-18  Tags: MySQL  点击:(97)  评论:(0)  加入收藏
如图所示,我们已经在macOS中安装完成了MySQL 服务器。 Configuration配置信息,如图所示。 专栏 Java程序员的macOS手册 作者:软件架构 19.8币 12人已购 查看 但是,如何使用My...【详细内容】
2021-10-12  Tags: MySQL  点击:(56)  评论:(0)  加入收藏
1.MySQL读写分离概念:MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读...【详细内容】
2021-10-11  Tags: MySQL  点击:(32)  评论:(0)  加入收藏
不啰嗦,直接上代码查询首字母:SELECTELT(INTERVAL(CONV(HEX(LEFT(CONVERT(`name` USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0...【详细内容】
2021-10-09  Tags: MySQL  点击:(83)  评论:(0)  加入收藏
如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生。众所周知,在mysql8以前,默认的存储引擎是:myslam。但mysql8之后,默认的存储引擎已经变成了:innodb,它是我们建表...【详细内容】
2021-09-17  Tags: MySQL  点击:(48)  评论:(0)  加入收藏
在之前的博客中,我写了一系列的文章,比较系统的学习了 MySQL 的事务、隔离级别、加锁流程以及死锁,我自认为对常见 SQL 语句的加锁原理已经掌握的足够了,但看到热心网友在评论中提出的一个问题我还是彻底被问蒙了。他的问...【详细内容】
2021-09-16  Tags: MySQL  点击:(58)  评论:(0)  加入收藏
加班原因是上线,解决线上数据库存在重复数据的问题,发现了程序的bug,很好解决,有点问题的是,修正线上的重复数据。线上库有6个表存在重复数据,其中2个表比较大,一个96万+、一个30万...【详细内容】
2021-09-16  Tags: MySQL  点击:(68)  评论:(0)  加入收藏
▌简易百科推荐
作者:雷文霆 爱可生华东交付服务部 DBA 成员,主要负责Mysql故障处理及相关技术支持。爱好看书,电影。座右铭,每一个不曾起舞的日子,都是对生命的辜负。 本文来源:原创投稿 *爱可生...【详细内容】
2021-12-24  爱可生    Tags:MySQL   点击:(6)  评论:(0)  加入收藏
生成间隙(gap)锁、临键(next-key)锁的前提条件 是在 RR 隔离级别下。有关Mysql记录锁、间隙(gap)锁、临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文章...【详细内容】
2021-12-14  python数据分析    Tags:MySQL记录锁   点击:(17)  评论:(0)  加入收藏
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二...【详细内容】
2021-12-14  linux上的码农    Tags:mysql   点击:(13)  评论:(0)  加入收藏
为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查...【详细内容】
2021-12-09  元宇宙iwemeta    Tags:mysql   点击:(15)  评论:(0)  加入收藏
测试的目的和原因,公司有很多程序员,每个程序员对数据库和表结构都有自己的理解。而且每个程序员的理解往往是以效率考虑。既然都是为了效率考虑,那么我就来测试一下究竟哪种使...【详细内容】
2021-12-08  吴彬的分享    Tags:Mysql数据库   点击:(14)  评论:(0)  加入收藏
当你们考虑项目并发的时候,我在部署环境,当你们在纠结使用ArrayList还是LinkedArrayList的时候,我还是在部署环境。所以啊,技术不止境,我在部环境。今天这篇文章缕一下在同一台服...【详细内容】
2021-12-08  秃头码哥    Tags:MySQL数据库   点击:(16)  评论:(0)  加入收藏
对于数据分析来说,MySQL使用最多的是查询,比如对数据进行排序、分组、去重、汇总及字符串匹配等,如果查询的数据涉及多个表,还需要要对表进行连接,本文就来说说MySQL中常用的查询...【详细内容】
2021-12-06  笨鸟学数据分析    Tags:MySQL   点击:(19)  评论:(0)  加入收藏
在学习SQL语句之前,首先需要区分几个概念,我们常说的数据库是指数据库软件,例如MySQL、Oracle、SQL Server等,而本文提到的数据库是指数据库软件中的一个个用于存储数据的容器。...【详细内容】
2021-11-24  笨鸟学数据分析    Tags:SQL语句   点击:(23)  评论:(0)  加入收藏
概述以前参加过一个库存系统,由于其业务复杂性,搞了很多个应用来支撑。这样的话一份库存数据就有可能同时有多个应用来修改库存数据。比如说,有定时任务域xx.cron,和SystemA域...【详细内容】
2021-11-05  Java云海    Tags:分布式锁   点击:(31)  评论:(0)  加入收藏
MySQL的进阶查询 一、 按关键字排序 使用ORDERBY语句来实现排序排序可针对一个或多个字段ASC:升序,默认排序方式 【升序是从小到大】DESC:降序 【降序是从大到小】ORDER BY的...【详细内容】
2021-11-05  Java热点    Tags:SQL语句   点击:(27)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条