# 主键 > 在之前的操作中我们进行了增删改查,并没有出现什么问题,但是有一个很大的问题,前面的姓名。年龄,性别都是有可能重复的,我们没有办法准确的确定到一个人,比如下面这种情况。 ## 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)