j9九游会登录/ 云数据库 rds_云数据库 rds for mysql/ / / 自增字段值跳变的原因
更新时间:2025-04-23 gmt 08:00

自增字段值跳变的原因-j9九游会登录

出现表中的自增字段取值不连续的情况,可能原因有以下几种:

  • 初值与步长问题,步长不为1会导致自增字段取值不连续。
    mysql> show variables like 'auto_inc%'; 
     -------------------------- -------  
    | variable_name            | value | 
     -------------------------- -------  
    | auto_increment_increment | 2     | 
    | auto_increment_offset    | 1     | 
     -------------------------- -------  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  2 | 
    |  4 | 
    |  6 | 
    |  8 | 
     ---- 
  • 直接修改表的auto_increment,会导致自增字段取值跳变。
    mysql> select * from animals; 
     ---- -----------  
    | id | name      | 
     ---- -----------  
    |  1 | fish       | 
    |  2 | cat       | 
    |  3 | penguin   | 
     ---- -----------  
    mysql> show create table animals; 
     --------- -----------------------------------------------------  
    | table   | create table                                                   | 
     --------- -----------------------------------------------------  
    | animals | create table `animals` (   
    `id` mediumint not null auto_increment,   
    `name` char(30) not null,   
    primary key (`id`) ) 
    engine=innodb auto_increment=4 default charset=utf8 | 
     --------- -----------------------------------------------------  
    mysql> alter table animals auto_increment=100; 
    query ok, 0 rows affected (0.04 sec) 
    records: 0  duplicates: 0  warnings: 0 
    mysql> show create table animals; 
     --------- -----------------------------------------------------  
    | table   | create table                                        | 
     --------- -----------------------------------------------------  
    | animals | create table `animals` (   
    `id` mediumint not null auto_increment,   
    `name` char(30) not null,   
    primary key (`id`) 
    ) engine=innodb auto_increment=100 default charset=utf8         | 
     --------- -----------------------------------------------------  
    mysql> insert into animals (id,name) values(0,'rabbit'); 
    query ok, 1 row affected (0.00 sec)  
    mysql> select * from animals; 
     ----- -----------  
    | id  | name      | 
     ----- -----------  
    |   1 | fish       | 
    |   2 | cat       | 
    |   3 | penguin   | 
    | 100 | rabbit    | 
     ----- -----------  
    9 rows in set (0.00 sec)
  • 插入数据时直接指定自增字段的取值,会导致自增字段取值跳变。
    mysql> select * from animals; 
     ---- -----------  
    | id | name      | 
     ---- -----------  
    |  1 | fish       | 
    |  2 | cat       | 
    |  3 | penguin   | 
     ---- -----------  
    mysql> insert into animals (id,name) values(100,'rabbit'); 
    query ok, 1 row affected (0.00 sec)  
    mysql> select * from animals; 
     ----- -----------  
    | id  | name      | 
     ----- -----------  
    |   1 | fish       | 
    |   2 | cat       | 
    |   3 | penguin   | 
    | 100 | rabbit    | 
     ----- -----------  
    9 rows in set (0.00 sec)
  • 未提交的事务或回滚的事务,会导致auto_increment增长,但回滚后不会下降。后续如果再次插入数据就会导致数据中的自增字段发生跳变。
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=4 default charset=utf8 | 
     ------------ ----------------------------------------  
    1 row in set (0.00 sec)  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
     ----  
    mysql> begin; 
    query ok, 0 rows affected (0.02 sec)  
    mysql> insert into auto_test1 values (0),(0),(0); 
    query ok, 3 rows affected (0.00 sec) 
    records: 3  duplicates: 0  warnings: 0  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
    |  4 | 
    |  5 | 
    |  6 | 
     ----  
    6 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | 
    create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=7 default charset=utf8 | 
     ------------ ----------------------------------------  
    1 row in set (0.00 sec)  
    mysql> rollback; 
    query ok, 0 rows affected (0.05 sec)  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
     ----  
    3 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=7 default charset=utf8 | 
     ------------ ----------------------------------------   
    mysql> insert into auto_test1 values (0),(0),(0); 
    query ok, 3 rows affected (0.01 sec) 
    records: 3  duplicates: 0  warnings: 0  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
    |  7 | 
    |  8 | 
    |  9 | 
     ----  
    6 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ -----------------------------------------  
    | table      | create table                            | 
     ------------ -----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=10 default charset=utf8 | 
     ------------ ----------------------------------------- 
  • 数据插入后,auto_increment变化,然后删除对应的数据行,auto_increment不会下降,后续如果再次插入数据就会导致数据中的自增字段发生跳变。
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=4 default charset=utf8 | 
     ------------ ----------------------------------------  
    1 row in set (0.00 sec)  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
     ----  
    mysql> insert into auto_test1 values (0),(0),(0); 
    query ok, 3 rows affected (0.00 sec) 
    records: 3  duplicates: 0  warnings: 0  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
    |  4 | 
    |  5 | 
    |  6 | 
     ----  
    6 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=7 default charset=utf8 | 
     ------------ ----------------------------------------  
    1 row in set (0.00 sec)  
    mysql> delete from auto_test1 where id>3;  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
     ----  
    3 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ ----------------------------------------  
    | table      | create table                           | 
     ------------ ----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=7 default charset=utf8 | 
     ------------ ----------------------------------------   
    mysql> insert into auto_test1 values (0),(0),(0); 
    query ok, 3 rows affected (0.01 sec) 
    records: 3  duplicates: 0  warnings: 0  
    mysql> select * from auto_test1; 
     ----  
    | id | 
     ----  
    |  1 | 
    |  2 | 
    |  3 | 
    |  7 | 
    |  8 | 
    |  9 | 
     ----  
    6 rows in set (0.00 sec)  
    mysql> show create table auto_test1; 
     ------------ -----------------------------------------  
    | table      | create table                            | 
     ------------ -----------------------------------------  
    | auto_test1 | create table `auto_test1` (   
    `id` int not null auto_increment,   
    primary key (`id`) 
    ) engine=innodb auto_increment=10 default charset=utf8 | 
     ------------ ----------------------------------------- 
  • 因为一些原因(比如唯一键冲突),使得插入数据最终未成功的,有可能导致auto_increment跳变。
    mysql> create table auto_test7(`id` int not null auto_increment, cred_id int unique, primary key (`id`));
    query ok, 0 rows affected (0.64 sec) 
    mysql> insert into auto_test7 values(null, 1);
    query ok, 1 row affected (0.03 sec) 
    mysql> show create table auto_test7;
     ------------ ------------------------------- 
    | table      | create table                  |
     ------------ ------------------------------- 
    | auto_test7 | create table `auto_test7` (  `id` int not null auto_increment,  `cred_id` int default null,  primary key (`id`),  unique key `cred_id` (`cred_id`)) engine=innodb auto_increment=2 default charset=utf8 |
     ------------ -------------------------------------------------------------- 
    1 row in set (0.00 sec) 
    mysql> insert into auto_test7 values(null, 1);
    error 1062 (23000): duplicate entry '1' for key 'auto_test7.cred_id'
    mysql> show create table auto_test7;
     ------------ -------------------------------------------------------------- 
    | table      | create table                                                 |
     ------------ -------------------------------------------------------------- 
    | auto_test7 | create table `auto_test7` (  `id` int not null auto_increment,  `cred_id` int default null,  primary key (`id`),  unique key `cred_id` (`cred_id`)) engine=innodb auto_increment=3 default charset=utf8 |
     ------------ --------------------------------------------------------------- 
  • 批量插入数据时(如insert...select、load file等),自增键的申请是分批申请的,每批申请2的n次方个序号,用完继续申请,没用完也不会退回,所以可能会导致auto_increment跳变。
    mysql> create table auto_test5_tmp(id tinyint not null auto_increment, name varchar(8), primary key (`id`));
    query ok, 0 rows affected (0.08 sec) 
    mysql> select * from auto_test5;
     ---- ------ 
    | id | name |
     ---- ------ 
    |  1 | a    |
    |  2 | b    |
    |  3 | c    |
    |  4 | x    |
    |  5 | y    |
    |  6 | z    |
    |  8 | a    |
    |  9 | b    |
    | 10 | c    |
    | 11 | x    |
    | 12 | y    |
    | 13 | z    |
     ---- ------ 
    12 rows in set (0.00 sec) 
    mysql> insert into auto_test5_tmp select 0,name from auto_test5;
    query ok, 12 rows affected (0.01 sec)
    records: 12  duplicates: 0  warnings: 0 
    mysql> select * from auto_test5_tmp;
     ---- ------ 
    | id | name |
     ---- ------ 
    |  1 | a    |
    |  2 | b    |
    |  3 | c    |
    |  4 | x    |
    |  5 | y    |
    |  6 | z    |
    |  7 | a    |
    |  8 | b    |
    |  9 | c    |
    | 10 | x    |
    | 11 | y    |
    | 12 | z    |
     ---- ------ 
    12 rows in set (0.00 sec) 
    mysql> show create table auto_test5_tmp;
     ---------------- ------------------------------------------------------- 
    | table          | create table                                          |
     ---------------- ------------------------------------------------------- 
    | auto_test5_tmp | create table `auto_test5_tmp` (  `id` tinyint not null auto_increment,  `name` varchar(8) default null,  primary key (`id`)) engine=innodb auto_increment=16 default charset=utf8 |
     ---------------- ------------------------------------------------------- 

相关文档

网站地图