一个mysql主键自增的问题

mysql数据库,存储引擎innbodb,主键选择自增,当插入数据并回滚后下次提交事务的时候主键的值是多少?

首先先创建一个简单的数据库,建表语句如下:

```

CREATE TABLE `test` (

  `id` int(10) NOT NULL AUTO_INCREMENT,

  `name` varchar(10) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

```

通过设置防止mysql的自动提交,

```

SET autocommit=1;

```

然后我们先在数据库里插入一条数据

```

START TRANSACTION;

INSERT INTO test(id,name) VALUES (10,''zs);

COMMIT;

```

下面我们再插入一条数据并回滚

```

START TRANSACTION;

INSERT INTO test(name) VALUES('ls');

ROLLBACK;

```

好了,接下来要做的就是再插入一条数据看mysql自增的id是多少了,

```

START TRANSACTION;

INSERT INTO test(name) VALUES('ls');

COMMIT;

```

事务提交后结果

可以看到id列变为了12,由此可知,当事务回滚时,主键的id自增并不会回滚,并且自增的初始值应该是

```

SELECT MAX(id) FROM test;

```

那么下面再做一个实验,我删除这两条数据并再次插入数据

```

START TRANSACTION;

DELETE FROM test;

INSERT INTO test(name) VALUES('ls');

COMMIT;

```

删除再插入的结果

结果表明mysql会记录id的最大值。

接下来删除表里所有的数据并重启数据库,重启完成后再次插入数据,

```

START TRANSACTION;

INSERT INTO test(name) VALUES('ls');

COMMIT;

```

重启后插入数据

由此可知mysql每次重启的时候回查询当前表的最大值,并且没有保存到数据库或者硬盘

下面将这条数据的主键改为3,并再次插入两条数据,由于在火狐插入图片会导致浏览器的崩溃,接下来的操作就不再插入图片,仅用文字和代码描述。

```

START TRANSACTION;

UPDATE test SET id=3;

COMMIT;

INSERT INTO test(name) VALUES('ls');

COMMIT;

INSERT INTO test(name) VALUES('ls');

COMMIT;

```

前两条sql正常秩序,在第二条的时候数据库里有两条数据,主键分别为2,3

第三条sql执行结果

```

[SQL]

INSERT INTO test(name) VALUES('ls');

[Err] 1062 - Duplicate entry '3' for key 'PRIMARY'

```

mysql的自增并不会跳过已有的值。

下边再次删除表中所有数据并重启mysql,初始我们先直接插入一条数据

```

START TRANSACTION;

INSERT INTO test(id,name) VALUES (10,''zs);

COMMIT;

INSERT INTO test(name) VALUES('ls');

COMMIT;

```

插入后显示第二条数据的id为11,主键的最大值并不是在mysql用到这张表的时候查询的,而是用到主键自增的时候查询的。

你可能感兴趣的:(一个mysql主键自增的问题)