![de1dd99a28324f611314006588d58cab.png](https://img-blog.csdnimg.cn/img_convert/de1dd99a28324f611314006588d58cab.png)
目录 1、主键 2、默认值约束 3、唯一约束 4、外键约束 5、非空约束
今天我们学习一下 SQL 的约束。
1、主键
在数据库中,如果有两行记录数据完全一样,那么如何来区分呢? 答案是无法区分,如果有两行记录完全相同,那么对于 Mysql 就会认定它们是同一个实体,这于现实生活是存在差别的。
假如我们要存储一个学生的信息,信息包含姓名,身高,性别,年龄。好了,这下巧了,有两个女孩都叫小红,且她们的身高和年龄相同,数据库将无法区分这两个实体,这时就需要用到主键了。
主键 (PRIMARY KEY) 是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要,主键不能有重复记录且不能为空。
比如我们这里,可以创建 employee 数据库,这里有主键:
![5fc5c8fcacd114916e10a6275824b033.png](https://img-blog.csdnimg.cn/img_convert/5fc5c8fcacd114916e10a6275824b033.png)
还有一种特殊的主键——复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识,比如:
![b412eeda9d0080b1eb42cd1dcf3180b7.png](https://img-blog.csdnimg.cn/img_convert/b412eeda9d0080b1eb42cd1dcf3180b7.png)
2、默认值约束
默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
默认值常用于一些可有可无的字段,比如用户的个性签名,如果用户没有设置,系统给他应该设定一个默认的文本,比如空文本或 ‘这个人太懒了,没有留下任何信息’
在 之前
创建的数据库命令 中,这段代码包含了 DEFAULT 约束:
people_num INT(10) DEFAULT 10,
DEFAULT 约束只会在使用 INSERT 语句(上一实验介绍过)时体现出来, INSERT 语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充,如语句:
# 正常插入数据
INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
# 插入新的数据,people_num 为空,使用默认值
INSERT INTO department(dpt_name) VALUES('dpt2');
输入命令SELECT * FROM department;
,可见表中第二行的people_num 被 DEFAULT 的值 (10) 填充:
![d1b6e3246810debaa68d06a8cb72f262.png](https://img-blog.csdnimg.cn/img_convert/d1b6e3246810debaa68d06a8cb72f262.png)
3、唯一约束
唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
在 之前创建的数据库命令 中,也有 UNIQUE 约束:
![37b4bf8428f20e95fb2a34847f83d08d.png](https://img-blog.csdnimg.cn/img_convert/37b4bf8428f20e95fb2a34847f83d08d.png)
当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE 约束,则 INSERT 失败,比如:
![6101b175ef33113c7f9e1fd27071bce3.png](https://img-blog.csdnimg.cn/img_convert/6101b175ef33113c7f9e1fd27071bce3.png)
4、外键 约束
外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
比如,现在有用户表和文章表,给文章表中添加一个指向用户 id 的外键,表示这篇文章所属的用户 id,外键将确保这个外键指向的记录是存在的,如果你尝试删除一个用户,而这个用户还有文章存在于数据库中,那么操作将无法完成并报错。因为你删除了该用户过后,他发布的文章都没有所属用户了,而这样的情况是不被允许的。同理,你在创建一篇文章的时候也不能为它指定一个不存在的用户 id。
一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
![545e766e948b661eeb0327de949b7f9a.png](https://img-blog.csdnimg.cn/img_convert/545e766e948b661eeb0327de949b7f9a.png)
在 INSERT 时,如果被外键约束的值没有在参考列中有对应,比如以下命令,参考列 (department 表的 dpt_name) 中没有 dpt3,则 INSERT 失败:
INSERT INTO employee VALUES(03,'xiaohong',12, 6000 ,123458,'dpt3');
可见之后将 dpt3 改为 dpt2(department 表中有 dpt2),则插入成功:
![069483540460bfd0686b7bc7c26f85e9.png](https://img-blog.csdnimg.cn/img_convert/069483540460bfd0686b7bc7c26f85e9.png)
![d3300d0b2f6ce9f1dc419f3fd8017437.png](https://img-blog.csdnimg.cn/img_convert/d3300d0b2f6ce9f1dc419f3fd8017437.png)
5、非空约束
非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
![bc884fbecd2dce79259083ad48d9d705.png](https://img-blog.csdnimg.cn/img_convert/bc884fbecd2dce79259083ad48d9d705.png)
在 MySQL 中违反非空约束,会报错,比如以下语句:
#INSERT 成功 age 为空,因为没有非空约束,表中显示 NULL
INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(04,'xiaowei',6500,123459,'dpt2');
#报错 salary 被非空约束,插入数据失败
INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(05,'xiaohe',23,123456,'dpt1');
![17bdfa2d289d46118454256e9c7c2cc9.png](https://img-blog.csdnimg.cn/img_convert/17bdfa2d289d46118454256e9c7c2cc9.png)
此时 employee 表的内容为:
![dc4126a7610a2650f3f3b4e6f8deb422.png](https://img-blog.csdnimg.cn/img_convert/dc4126a7610a2650f3f3b4e6f8deb422.png)
6、总结
本节实验中通过一个数据库实例了解了主键、默认值、外键、非空、唯一这几种约束的特性,这几种约束都是最常见的,需要仔细理解每种约束的含义及使用场景。
![c6928d680978132ba970419382d94bc4.png](https://img-blog.csdnimg.cn/img_convert/c6928d680978132ba970419382d94bc4.png)