MariaDB ненужный AUTO_INCREMENT с предложением ON DUPLICATE - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть таблица с именем srcCodDsc, которая имеет 3 столбца:

  • ID: INT ПЕРВИЧНЫЙ КЛЮЧ с AUTO_INCREMENT
  • locId: VARCHAR
  • locDsc: VARCHAR

Я также определил уникальный индекс для locId, чтобы избежать дублирования значения locId.

Теперь проблема:

INSERT INTO srcCodDsc (locId,locDsc) VALUES ('012_002','value to set') 
ON DUPLICATE KEY UPDATE locDsc=VALUES(locDsc);

Запрос корректно обновляет значение locDsc строки с locId = '012_002', но я обнаруживаю, что счетчик следующего значения AUTO_INCREMENT увеличивается при каждом выполнении запроса, даже если новая строка не вставляется.

Я проверяю это командой:

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA='berna' AND TABLE_NAME='srcCodDsc';

Как преобразовать запрос в условную форму, которая после проверки, существует ли запись с locId = '012_002', в одном случае вставляет, в другом обновляет, и если locDsc уже стоит, новое значение ничего не делает

ПРИМЕЧАНИЕ: тот же запрос в mySql работает и не обновляет следующее значение auto_increment.

Спасибо

1 Ответ

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

Для повышения эффективности различные INSERT -подобные операторы быстро захватывают значения AUTO_INCREMENT, которые ему могут понадобиться , а затем переходят к выполнению запроса. В вашем случае идентификатор не был нужен, поэтому он был «сожжен».

Я считаю, что это работает одинаково как в MySQL, так и в MariaDB. Если вы обнаружили разницу, укажите номера версий обоих, а также значение переменной innodb_autoinc_lock_mode.

Примечание также: (до MySQL 8.0) Если вы остановите и перезапустите MySQL / MariaDB между записью идентификатора last в таблице, этот идентификатор будет использоваться повторно. (Это приводит к неожиданности другого типа, следовательно, к изменению в 8.0.)

...