MySQL 主键约束、非空约束、唯一约束
关注【郑大钱呀
】【公】【众】【号】,我们一起交流,一起学习。
文章目录
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 结尾
本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注、转发、收藏,谢谢。