Что может привести к тому, что значение auto_increment подпрыгнет на миллиарды значений и достигнет максимального значения int?

Наша основная таблица использует столбец первичного ключа int unsigned auto_increment. Сегодня он пропустил все значения вплоть до 4294967295.

Я смог решить эту проблему, удалив оскорбительный ряд и запустить

ALTER TABLE [table] AUTO_INCREMENT = [new value];

Но я не могу объяснить, как или почему это произошло.

Наша среда MariaDB 10.2.27 под PHP / Apache.

0
Umbrella 19 Дек 2019 в 01:23

1 ответ

Любой INSERT может указывать высокое значение, и это неявно продвигает следующее значение автоинкремента. Другими словами, автоинкремент для таблицы никогда не будет меньше самого большого значения, вставленного в данный момент в таблицу, и любой клиент может переопределить механизм автоинкремента, просто указав значение в INSERT.

Демо:

mysql> create table mytable (id int unsigned auto_increment primary key);

mysql> insert into mytable (id) values (DEFAULT);
Query OK, 1 row affected (0.01 sec)

Это должно было вставить значение id 1, поэтому следующий AI будет 2:

mysql> show create table mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4

Теперь я указываю большое значение, и ИИ обновляется соответственно:

mysql> insert into mytable (id) values(1000000000);
Query OK, 1 row affected (0.01 sec)

mysql> show create table mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000000001 DEFAULT CHARSET=utf8mb4

32

mysql> insert into mytable (id) values(1000000000000);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show create table mytable\G
*************************** 1. row ***************************
       Table: mytable
Create Table: CREATE TABLE `mytable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8mb4

Итак, кто-то должен был вставить большое значение. Любое значение больше 4294967295 будет усечено до 4294967295, а затем последующие вставки, которые попытаются использовать последовательность AI, завершатся ошибкой.

1
ysth 19 Дек 2019 в 02:02
Спасибо за обстоятельный ответ. Я понимаю описываемый вами эффект, но мне неизвестен какой-либо путь кода (в нашем приложении), который позволил бы чему-либо указать значение для этого столбца, чтобы вызвать этот эффект.
 – 
Umbrella
19 Дек 2019 в 18:33
Либо это в вашем приложении, либо кто-то сделал вставку вручную с помощью клиента mysql. Или ALTER TABLE, чтобы вручную установить значение AI.
 – 
Bill Karwin
19 Дек 2019 в 20:45
Что-то еще, что я узнал, сбой, INSERT могут вызывать пропуск значений, но не до этой степени.
 – 
Umbrella
20 Дек 2019 в 00:32
На самом деле я обнаружил в нашем коде оскорбительный кодовый путь.
 – 
Umbrella
20 Дек 2019 в 00:32