一. 前言
刚学完Mysql语言后,在进行建表的时候除非是对像一些部门管理表,员工管理表等等的两者之间有联系以及需要连接查询的两张表有设置id字段(同时声明primary key + AUTO_INCREMENT 约束),否则根本不会想到要添加这样的字段。在进行对一些项目源代码的观察中,发现几乎里面每一个表都有创建一个加上主键自增的字段--“id”。
在了解原因之前,让我们先回顾一下主键约束(primary key)和自增约束(Auto—increment)
二.回顾
一.主键约束
1. 作用
- PRIMARY KEY约束唯一标识数据库表中的每条记录(行)
- 保证实体的完整性
- 加快数据库的操作速度
- 用于其他表的关联(外键约束),以及本记录的修改与删除
2.特点
- 主键约束相当于唯一约束+非空约束
- Mysql中主键名一直是PRIMARY,就算自己命名了也没用
- 创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引 3. 要求
- 一个表中最多只能出现一次主键约束,允许列级和表级创建
- 不要修改主键的值,否则会破坏表的完整性
二.自增约束
1. 作用
- Auto—increment可以产生唯一标识符和顺序值,设置自增长可以有效配合主键来对表进行唯一标识 2.特点
- 如果自增列指定了0和null,,会在当前最大值的基础上自增,如果自增列手动指定了具体值,直接赋值为具体值 3. 要求
- 与主键相同的一个表中只能有一个自增列
- 自增约束的列的数据必须是整数类型(int)
三.解决问题
从以上的三张创建表的代码中可以看出,id每次都有出现(id,bid,userid)且每个都有声明主键和自增约束
可是归根结底这些所谓的id字段在实际应用中大多数没有很好的体现。
“主键”对于学过数据库的人来说,都知道是非常重要的,每一个表都需要一个主键,但难就难在使用上。
像邮箱,姓名,地址等等可能有时候不可避免的会重复,一旦将这些东西作为字段的话,到头来面对出现重复又基于不破坏表完整性的问题来看,只能是束手无策。
所以在这样的表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值。这一列被用作表的主键,从而通过它来确定表中每一条记录,即便其他的列允许出现适当的重复项。这样的主键通常称为伪主键或者代理键。
四.注意事项
虽然在前面强调了主键id的重要性,但也不能滥用伪主键 使用伪主键以及自增长约束并没有什么错误,但不是每张表都需要一个伪主键,更没必要将每个主键都设定为id.
1.冗余键值
一个组合键它包含了多个不同的列,主键需要使得一个Product_Id和Account_Id的组合在整张表中只能出现一次,不出现重复项。
然而,当你使用了Id这一列作为主键,主键约束就不是Account_Id和Product_Id了。当你用这张交叉表去查询Account_Id和Product_Id的关系时,重复项会意料之外的结果。所以如果想确保没有重复项,你可以在Id之外,额外声明另外两列需要一个UNIQUE约束。但是当你在Account_Id和Product_Id这两列上应用了唯一性约束,Id这一字段就成为了多余的,毫无意义。
2.关键字不明确
若两张表中,其中一张表有id,另一张表也有相同的“id”,这样的情况首先看着就容易混淆,想想写查询的时候左一个id又一个id,系统无法识别,你还不得不每个都加上一个别名,麻不麻烦!同样的,同时有两张表有相同的Id列的情况下也不能够使用using关键字,所以关于所谓“id”的更名还需要花心思,最好是能够一看让其他人一看便知。
3.unqiue与primary key
| 约束类型 | 相同处 | 不同处 |
|---|---|---|
| unique | 值唯一 | 可为空,可有多个 |
| primary key | 值唯一 | 不可为空,有索引,只能有一个 |
在标识唯一性的下,主键声明后能自动产生一个索引,更有利于数据库查询以及删除,效率会更大,但是不能为空,在实际操作时可有按照实际应用进行选择,但总体而言使用频率更大的都是主键约束