MariaDB AUTO_INCREMENT поведение при установке отрицательного ключа - PullRequest
0 голосов
/ 17 сентября 2018

Это вопрос, связанный с 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.

1 Ответ

0 голосов
/ 06 октября 2018

В соответствии с ошибкой AUTO_INCREMENT разрывается после обновления значения столбца на отрицательное число , ваша проблема была исправлена ​​в 10.2.16 и 10.3.8. Если вы можете продемонстрировать это в 10.2.16, я предлагаю вам попытаться открыть этот отчет об ошибке.

Между тем несколько случайных комментариев:

Лучше всего оставить AUTO_INCREMENT столбцов в покое.

Что означает отрицание (как в SET myid = myid * (-1)) количества UNSIGNED`? Мусор.

18446744073709551615, в шестнадцатеричном виде, равно ffffffffffffffff и является максимальным значением для BIGINT UNSIGNED. Но этот гекс является представлением -1 в BIGINT UNSIGNED.

Это

auto_increment_increment     10
auto_increment_offset        1

заявляет, что значение должно быть 1, 11, 21, 31, 41, ... вместо обычных 1,2,3,4,5, ...

В некотором роде: _Bug: last_insert (id) не поддерживает bigint unsigned_

Когда я тестировал на 5.6.22:

  • BIGINT SIGNED - myid было -1 для 'a'.
  • BIGINT UNSIGNED - UPDATE cmplained with «ОШИБКА 1690 (22003): значение BIGINT UNSIGNED вне диапазона в« (try. test_autoinc. myid * - (1)) '»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...