| Bug #91038 | AUTO_INCREMENT does not increase automatically | ||
|---|---|---|---|
| Submitted: | 28 May 2018 3:48 | Modified: | 5 Jun 2018 10:16 |
| Reporter: | KO WEI LEE | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: Information schema | Severity: | S2 (Serious) |
| Version: | 8.0.11 | OS: | Windows (WIN 10) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | regression | ||
[28 May 2018 3:48]
KO WEI LEE
[28 May 2018 4:12]
KO WEI LEE
A creating table script
Attachment: mysql-bug-data-91038.zip (application/x-zip-compressed, text), 1.70 MiB.
[31 May 2018 9:08]
MySQL Verification Team
Hello Lee! Thank you for the report and test case. Thanks, Umesh
[31 May 2018 9:10]
MySQL Verification Team
-- 8.0.11 - affected
[umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-8.0.11: bin/mysql -uroot -S /tmp/mysql_ushastry.sock test < mysql-bug-data-91038/temp_order.sql
[umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-8.0.11: bin/mysql -uroot -S /tmp/mysql_ushastry.sock test
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 MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select max(id) from temp_order;
+---------+
| max(id) |
+---------+
| 68840 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE();
+----------------+
| AUTO_INCREMENT |
+----------------+
| 68841 |
+----------------+
1 row in set (0.10 sec)
mysql> show create table temp_order\G
*************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
.
) ENGINE=InnoDB AUTO_INCREMENT=68841 DEFAULT CHARSET=utf8 COMMENT='旅团订购'
1 row in set (0.00 sec)
mysql> INSERT INTO `temp_order` VALUES (NULL,'TO68841','C15CBR0724','LADEL','67220','DTCBR','XXXNA','2015-07-24 00:00:00','MR','Kevin','Hui','Hana Yu','ACTV1',7,0,0,0,0,0,0,0,24.30000,20.00000,0.00000,0.00000,0.00000,NULL,0.00000,NULL,0,'20150723120316',0.00000,0.00000,'','2015-07-23 12:03:16',0.00000,35.00000,NULL,'\0',NULL,NULL,NULL,NULL,NULL,'',0,'',0.00000);
Query OK, 1 row affected (0.02 sec)
mysql> select max(id) from temp_order;
+---------+
| max(id) |
+---------+
| 68841 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE();
+----------------+
| AUTO_INCREMENT |
+----------------+
| 68841 |
+----------------+
1 row in set (0.01 sec)
^^ Which sounds unsual since in general this is value+1, where value is the largest value for the column currently in the table.
mysql> show create table temp_order\G
*************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
.
) ENGINE=InnoDB AUTO_INCREMENT=68842 DEFAULT CHARSET=utf8 COMMENT='旅团订购'
1 row in set (0.01 sec)
[31 May 2018 9:11]
MySQL Verification Team
-- 5.7.22 - looks fine
[umshastr@hod03]/export/umesh/server/binaries/GABuilds/mysql-5.7.22: bin/mysql -uroot -S /tmp/mysql_ushastry.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.22-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select max(id) from temp_order;
+---------+
| max(id) |
+---------+
| 68840 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE();
+----------------+
| AUTO_INCREMENT |
+----------------+
| 68841 |
+----------------+
1 row in set (0.00 sec)
mysql> show create table temp_order\G
*************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
.
) ENGINE=InnoDB AUTO_INCREMENT=68841 DEFAULT CHARSET=utf8 COMMENT='旅团订购'
1 row in set (0.00 sec)
mysql> INSERT INTO `temp_order` VALUES (NULL,'TO68841','C15CBR0724','LADEL','67220','DTCBR','XXXNA','2015-07-24 00:00:00','MR','Kevin','Hui','Hana Yu','ACTV1',7,0,0,0,0,0,0,0,24.30000,20.00000
-> ,0.00000,0.00000,0.00000,NULL,0.00000,NULL,0,'20150723120316',0.00000,0.00000,'','2015-07-23 12:03:16',0.00000,35.00000,NULL,'\0',NULL,NULL,NULL,NULL,NULL,'',0,'',0.00000);
Query OK, 1 row affected (0.00 sec)
mysql> show create table temp_order\G *************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(20) NOT NULL COMMENT '旅团订购编号',
.
) ENGINE=InnoDB AUTO_INCREMENT=68842 DEFAULT CHARSET=utf8 COMMENT='旅团订购'
1 row in set (0.00 sec)
mysql> SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); +----------------+
| AUTO_INCREMENT |
+----------------+
| 68842 |
+----------------+
1 row in set (0.00 sec)
Which sounds all good since in general this is value+1, where value is the largest value for the column currently in the table.
mysql> select max(id) from temp_order;
+---------+
| max(id) |
+---------+
| 68841 |
+---------+
1 row in set (0.00 sec)
[5 Jun 2018 9:21]
Gopal Shankar
The behavior seem to be correct, based on the default setting for information_schema_stats_expiry=86400 secs (= 1 day). This is introduced in 8.0 and not present in 5.7. The expectation stated in bug page can be observed with setting information_schema_stats_expiry=0. Please refer following page for more info, https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_in formation_schema_stats_expiry Test results that demonstrates the behavior: ```````````````````````````````````````````` Note that the INFORMATION_SCHEMA.TABLES.AUTO_INCREMENT value remains same until we set information_schema_stats_expiry=0. This will enable I_S to stop using the cached statistics value and always get latest statistics. ... CREATE TABLE `temp_order` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `code` varchar(20) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=68842 ; INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68842 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68843 INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68843 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68843 INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68844 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68843 set session information_schema_stats_expiry=0; INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68845 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68846 INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68846 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68847 INSERT INTO `temp_order` VALUES (NULL, 'abc'); select max(id) from temp_order; max(id) 68847 SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'temp_order' AND table_schema = DATABASE(); AUTO_INCREMENT 68848 DROP TABLE `temp_order`; ...
[7 Jun 2018 22:07]
William Chiquito
In my test case the error persists:
* Windows 10
Z:\>mysql
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
...
mysql> DROP TABLE IF EXISTS `temp_order`;
Query OK, 0 rows affected (0.27 sec)
mysql> CREATE TABLE IF NOT EXISTS `temp_order` (
-> `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.49 sec)
mysql> SELECT AUTO_INCREMENT
-> FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_NAME = 'temp_order'
-> AND TABLE_SCHEMA = DATABASE();
+----------------+
| AUTO_INCREMENT |
+----------------+
| NULL |
+----------------+
1 row in set (0.05 sec)
mysql> SHOW CREATE TABLE `temp_order`\G
*************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> INSERT INTO `temp_order`
-> VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL);
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> SELECT MAX(`id`)
-> FROM `temp_order`;
+-----------+
| MAX(`id`) |
+-----------+
| 6 |
+-----------+
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE `temp_order`\G
*************************** 1. row ***************************
Table: temp_order
Create Table: CREATE TABLE `temp_order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> SELECT AUTO_INCREMENT
-> FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_NAME = 'temp_order';
+----------------+
| AUTO_INCREMENT |
+----------------+
| NULL |
+----------------+
1 row in set (0.00 sec)
* Linux
See https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=31b3589425c24a9b869cb05bcef1fda6
[8 Jun 2018 6:22]
Ståle Deraas
Posted by developer: Hi William, Even after setting information_schema_stats_expiry = 0 , like Gopal has suggested above? It did not show from your repro....
[8 Jun 2018 9:23]
William Chiquito
It's correct, after setting information_schema_stats_expiry = 0 everything works as expected. See https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b21ee67940aca7816f528f8f9f527e58.
[8 Jun 2018 11:03]
Ståle Deraas
Posted by developer: OK, so it works as documented then.
[14 May 2019 21:35]
K-A S
setting information_schema_stats_expiry = 0 only works for the current session. If I need to access the uncached value every time I query or every time my application queries information_schema, how would I achieve this?
[15 May 2019 10:35]
Ståle Deraas
Posted by developer: As you can see in https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_sc... , there is a global and session scope for this variable. To get the global scope you can use SET GLOBAL, and if you want the setting to survive a server restart you can use SET PERSIST, see https://dev.mysql.com/doc/refman/8.0/en/set-variable.html . So to get a permanent setting for the server you can use: SET PERSIST information-schema-stats-expiry=0
[16 May 2019 5:08]
K-A S
I tried using both GLOBAL and PERSIST, and neither of those worked.
[8 Jul 2019 12:24]
MySQL Verification Team
Bug #96124 marked as duplicate of this one
[5 Apr 2021 6:00]
MySQL Verification Team
Related - Bug #103197
