Это вопрос, связанный с MariaDB, относительно поведения AUTO_INCREMENT
, которое я сейчас не могу обернуть. MariaDB версия: 10.2.16.
Приведена следующая таблица:
CREATE TABLE `test_autoinc` (
`myid` BIGINT(255) NOT NULL AUTO_INCREMENT,
`myval` VARCHAR(16) NOT NULL,
PRIMARY KEY (`myid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
Для проверки AUTO_INCREMENT
:
SHOW TABLE STATUS
FROM `myDB`
WHERE `name` LIKE 'test_autoinc' ;
/* => AUTO_INCREMENT= 1 */
Теперь добавьте некоторые данные:
INSERT INTO `test_autoinc` (`myval`) VALUES ('a'), ('b'), ('c');
/* => AUTO_INCREMENT = 31 (offset 10 has been configured... all fine) */
Если я сейчас выполню это обновление ...
UPDATE `test_autoinc`
SET `myid` = `myid` * (-1)
WHERE `myval` = 'a';
... Теперь у меня есть AUTO_INCREMENT
из 18446744073709551615
!
После некоторого копания я обнаружил , почему это происходит :
У меня с некоторого времени была эта таблица с соответствующим механизмом, и я никогда не обнаруживал никаких проблем с этим. Он вложен глубоко в унаследованное приложение, которое я сейчас переношу на другой сервер базы данных, поэтому изменить его на самом деле не вариант.
В таблице может быть только один столбец AUTO_INCREMENT, он должен быть
индексируется, и он не может иметь значение DEFAULT. Столбец AUTO_INCREMENT
работает правильно, только если он содержит только положительные значения. Вставка
отрицательное число рассматривается как вставка очень большого положительного числа.
Это сделано, чтобы избежать проблем с точностью, когда числа переносятся из
с положительного на отрицательный, а также, чтобы вы не случайно
получить столбец AUTO_INCREMENT, который содержит 0.
AUTO_INCREMENT
связанные параметры:
SHOW VARIABLES LIKE "%incre%";
auto_increment_increment 10
auto_increment_offset 1
div_precision_increment 4
innodb_autoextend_increment 64
wsrep_auto_increment_control ON
Заранее всем большое спасибо.
Мой вопрос:
Как я могу адаптировать это поведение без изменения этого механизма? Я бы ожидал AUTO_INCREMENT
из 31
.