MySQL学习-自增列

157 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

前言

上篇我们学习了MySQL中的PRIMARY KEY约束。有兴趣的小伙伴可以阅读(# MySQL学习-PRIMARY KEY约束)。
下面学习MySQL中的自增列。

自增列

作用

表中某个字段的值自增。

关键字

AUTO_INCREMENT

特点

  • 一个表中最多只能有一个自增长列。
  • 当需要产生唯一标识符或顺序值时,可设置自增长。
  • 自增长列约束的列必须是键列(主键列,唯一键列)。
  • 自增约束的列的数据类型必须是整数类型。
  • 如果自增列指定了0和NULL,会在当前最大值的基础上自增,如果手动指定了值,直接赋值为具体值。

指定自增约束

指定自增约束,可以在创建表时,也可以在创建表后。

创建表时

CREATE TABLE 表名(
    字段名 数据类型 PRIMARY KEY AUTO_INCREMENT,
);

举例一

创建表emp,其中id自增。

CREATE TABLE emp(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(30)
);

创建表后

ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT;

举例二

ALTER TABLE emp MODIFY id INT AUTO_INCREMENT;

删除自增列

ALTER TABLE 表名 MODIFY 字段名 数据类型;

去掉AUTO_INCREMENT就相当于是删除自增列。

举例三

ALTER TABLE emp MODIFY id INT;

这样就删除了自增列id。

MySQL8.0新特性-自增变量持久化

在MySQL8.0之前,自增主键AUTO_INCREMENT的值如果大于max(PRIMARY KEY) + 1,在MySQL重启后,会重置AUTO_INCREMENT=max(PRIMARY KEY) + 1,这种现象在某些情况下会导致业务主键冲突或者其它难以发现的问题。

MySQL5.0测试

创建表emp,id主键自增。

CREATE TABLE emp(
    id INT PRIMARY KEY AUTO_INCREMENT
);

插入数据。

INSERT INTO emp
VALUES(0), (0);

SELECT * FROM emp;
id
1
2

删除id为2的数据。再插入一条数据。

DELETE FROM emp 
WHERE id = 2;

INSERT INTO emp
VALUES(0);

SELECT * FROM emp;
id
1
3

从结果中看出,虽然删除了id=2的数据,但是再次插入数据时,并没有重用被删除的2,而是使用了3。删除id=3的记录。

DELETE FROM emp 
WHERE id = 3;

此时,重启数据库,插入数据。

INSERT INTO emp
VALUES(0);

SELECT * FROM emp;
id
1
2

从结果中可以看出,新插入的值使用了2,按照重启前的操作,这时应该使用4。出现这个原因是自增主键没有持久化。

MySQL8.0测试

重复以上步骤,可以得出以下结果:

id
1
4

从结果可以看出,自增变量已经持久化了。数据库重启后,也会延用之前的字段最大值自增。

今天先学习到这里,明天继续。