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用到这张表的时候查询的,而是用到主键自增的时候查询的。