Mysql Mariadb自动增量删除所有记录后重置

Mysql Mariadb自动增量删除所有记录后重置,mysql,mariadb,auto-increment,Mysql,Mariadb,Auto Increment,当我从mysql表中删除所有记录时,自动递增计数器被重置为0。我的应用程序逻辑是将记录从MySQL迁移到其他分析引擎,然后从MySQL中删除迁移的记录。分析引擎使用与MySQL相同的主键管理记录,因此当MySQL重置计数器时,我的分析引擎中出现重复键错误。我希望Mysql保留自动增量,即使我从数据库中删除了所有记录 alter table test auto_increment = 100; 我可以在删除记录后执行上述查询以保留自动增量,但如果重新启动MySQL,该计数器将再次重置为默认值0

当我从mysql表中删除所有记录时,自动递增计数器被重置为0。我的应用程序逻辑是将记录从MySQL迁移到其他分析引擎,然后从MySQL中删除迁移的记录。分析引擎使用与MySQL相同的主键管理记录,因此当MySQL重置计数器时,我的分析引擎中出现重复键错误。我希望Mysql保留自动增量,即使我从数据库中删除了所有记录

alter table test auto_increment = 100;
我可以在删除记录后执行上述查询以保留自动增量,但如果重新启动MySQL,该计数器将再次重置为默认值0

我知道这是MySQL的预期行为。但我正在寻找一个解决办法来克服它

我使用的是mariadb而不是mysql。请参阅重启前后的自动增量计数器

MariaDB [MY_DB]> SHOW TABLE STATUS FROM `MY_DB` WHERE `name` LIKE 'test' ;
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name    | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    6 |           2730 |       16384 |               0 |            0 |         0 |              7 | 2017-05-22 23:38:06 | NULL        | NULL       | utf8_bin  |     NULL |                |         |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)

MariaDB [MY_DB]> select max(id) from test;
+---------------+
| max(id) |
+---------------+
|             6 |
+---------------+
1 row in set (0.00 sec)

MariaDB [MY_DB]> delete from test where id in (1,2,3,4,5,6);
Query OK, 6 rows affected (0.00 sec)

MariaDB [MY_DB]> SHOW TABLE STATUS FROM `MY_DB` WHERE `name` LIKE 'test' ;
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name    | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |         0 |              7 | 2017-05-22 23:38:06 | NULL        | NULL       | utf8_bin  |     NULL |                |         |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
1 row in set (0.00 sec)

MariaDB [MY_DB]> exit
Bye
root@atd-3000:~# systemctl restart mariadb
root@atd-3000:~# mysql -p***** MY_DB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 57
Server version: 10.1.17-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [MY_DB]> SHOW TABLE STATUS FROM `MY_DB` WHERE `name` LIKE 'test' ;
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| Name    | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |         0 |              1 | 2017-05-22 23:38:06 | NULL        | NULL       | utf8_bin  |     NULL |                |         |
+---------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------+----------+----------------+---------+

DELETE
不会重置
AUTO_INCREMENT
,但是
TRUNCATE
会,请参见
DELETE
不会重置
AUTO_INCREMENT
,但是
TRUNCATE
会,请参见实际上,TRUNCATE query首先完全删除表,然后创建一个空白表。。。因为它现在是一个全新的表,所以自动增量id被重置为1


另一方面,drop查询只删除表&不创建新表;因此,自动增量id保持不变。

实际上,truncate query首先完全删除表,然后创建一个空白表。。。因为它现在是一个全新的表,所以自动增量id被重置为1


另一方面,drop查询只删除表&不创建新表;因此,自动增量id保持不变。

由于innodb是基于内存的计数器,innodb不会保留自动增量值。我已经实施了一个解决方案:

  • 从Mariadb中删除记录后,我将在其他表中保留max ID
  • mariadb服务启动后,在POSTINT中,我在读取最大ID后设置表的自动增量计数器。在这里,我检查自动增量计数器是否已经大于我拥有的最大ID,然后我不更新它。如果小于,我更新计数器

  • 希望它能帮助其他面临同样问题的人。

    由于innodb是基于内存的计数器,innodb不会保留自动增量值。我已经实施了一个解决方案:

  • 从Mariadb中删除记录后,我将在其他表中保留max ID
  • mariadb服务启动后,在POSTINT中,我在读取最大ID后设置表的自动增量计数器。在这里,我检查自动增量计数器是否已经大于我拥有的最大ID,然后我不更新它。如果小于,我更新计数器

  • 希望它能帮助其他面临同样问题的人。

    DELETE query不会重置自动增量id,而TRUNCATE将发布用于删除所有迁移行的查询。您是对的。但是如果重新启动mysql,它会将自动增量计数器重置回1。下面是我正在使用的删除查询:
    delete from test where id in(1,2,3,4,5)
    No它不会!?!?删除查询不会重置自动增量id,而TRUNCATE将发布用于删除所有已迁移行的查询。您是对的。但是如果重新启动mysql,它会将自动增量计数器重置回1。下面是我正在使用的删除查询:
    delete from test where id in(1,2,3,4,5)
    No它不会!?!?你是对的。但如果重新启动mysql,它会将自动递增计数器重置回1。因为自动递增是基于内存的计数器。Innodb引擎执行
    MAX(id)
    以获得自动增量。你说得对。但如果重新启动mysql,它会将自动递增计数器重置回1。因为自动递增是基于内存的计数器。Innodb引擎执行
    MAX(id)
    以获得自动增量。裁判: