Files
mysql-press/docs/mysql/primaryKey.md
2021-05-08 13:50:13 +08:00

74 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 主键
> 在之前的操作中我们进行了增删改查,并没有出现什么问题,但是有一个很大的问题,前面的姓名。年龄,性别都是有可能重复的,我们没有办法准确的确定到一个人,比如下面这种情况。
## primary key
先看一下现在表中的数据。
![图 4](../../images/4874f36184f21487e8bf5a353f8c9416d2db19b3f37dc98ab1687afceac80ac3.png)
现在表中还有李四和小名这两个人但是这个班级中又来了一个转校生名字也叫李四性别也是男但是年龄是21。
先添加这么一个人
```sql
insert into class(name,sex,age) value("李四","",21);
```
![图 1](../../images/843b7985265bdaaba9b61d061a462f32f6b599bb651b0a635313d9ed789f4ce9.png)
现在添加进去了但是如果我想让10岁的李四的年龄改成11那么我们应该怎么改呢现在只有他的年龄是10我们可以直接使用年龄来修改
```sql
updaet class set age = 11 where age = 10;
```
但是如果又来了一个同学年龄又是10是不是更难确定到一行的数据了。
再极端一点 名字性别年龄都是一样的,那么是不是就无法区分这两行数据了。
所以有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
例如假设我们把name字段作为主键那么通过名字小明或小红就能唯一确定一条记录。但是这么设定就没法存储同名的同学了因为插入相同主键的两条记录是不被允许的。
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。
因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。
作为主键最好是完全业务无关的字段我们一般把这个字段命名为id。
而且主键一般都是自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键
所以下面将看一下如何定一一个带有主键的表,和什么叫自增。
## 定义一个含有主键的表
前面我们创建的class表并没有主键那么我们如何创建一个带有主键的表呢
比如要创建一个名字叫 `articles` 的表,表的结构像下面一样
| id | name | author |
|----|-----|-----|
- id 作为主键
- name 放文章的名字
- author 放作者的名字
```sql
create table articles(
id int auto_increment,
name varchar(100),
author varchar(10),
primary key(id)
);
```
![图 2](../../images/f69e4725abae353880556f34846c807da14e67a928ebd858ec3f0164e8266bce.png)
创建成功了,查看一下
![图 3](../../images/4fbfe8a92c8540c4c01c4c9c26ef90e06edb0489b704a481ae9cb2588251df16.png)