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 nullmysql> 【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: 0Duplicates: 0Warnings: 0mysql> 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>


推荐阅读