MySQL AUTO_INCREMENT не увеличивается ни при каком запросе INSERT - PullRequest
0 голосов
/ 05 февраля 2019

Свойство таблицы AUTO_INCREMENT не увеличивается ни на одно значение каждый раз после INSERT - оно привязано к конкретному целочисленному значению.

Я тестирую свой проект на моем локальном компьютере.Как есть, у меня есть (после INSERT) триггер, который сильно зависит от свойства AUTO_INCREMENT таблицы, так как я обновляю поле и вставляю строку с LAST INSERTED ID, добавленным как суффикс.Однако независимо от того, сколько раз я выполняю запрос INSERT, значение AUTO_INCREMENT не увеличивается.

Вот как выглядит содержимое таблицы: table content

И это свойства таблицы/ option options: table properties/option values

Я также обращался к information_schema.TABLES, но там также говорится, что AUTO_INCREMENT имеет значение 4, которое технически должно быть 5 ... верно ?: information_schema.TABLES

Я обеспокоен тем, что эта проблема может быть воспроизведена на производственном сервере, так как это - мой триггер сильно зависит от значения "этого" AUTO_INCREMENT.Если его не решить, это приведет к дублированию значений, что неприемлемо для системы, над которой я работаю.Это определение триггера, которое зависит от значения AUTO_INCREMENT: Trigger Definition

Я ожидаю, что значение AUTO_INCREMENT должно равняться полю идентификатора таблицы с включенным автоматическим приращением.в этом случае они (ID и значение AUTO_INCREMENT должны быть равны 5.

моя база данных является копией действующей базы данных, которая была выгружена в файл .sql и восстановлена ​​на моем локальном экземпляре mysql.:

CREATE TABLE `imei`  (
  `imei_id` int(11) NOT NULL AUTO_INCREMENT,
  `identity_imei` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci GENERATED ALWAYS AS ((case when (`imei_from` = _utf8mb3'board') then `board_imei` when (`imei_from` = _utf8mb3'dcover') then `auto_generated_imei` when (`imei_from` = _utf8mb3'sim_tray') then `auto_generated_imei` when (`imei_from` = _utf8mb3'sticker') then `auto_generated_imei` end)) VIRTUAL NOT NULL,
  `board_imei` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `auto_generated_imei` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `expected_imei` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `imei_from` enum('board','dcover','sim_tray','sticker') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `generated_by_id` int(11) NOT NULL,
  `date_generated` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`imei_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

1 Ответ

0 голосов
/ 05 февраля 2019

Я предполагаю, что вы хотите, чтобы auto_generated_imei основывался на сгенерированном идентификаторе в imei_id в той же строке.

Но ваш триггер является триггером BEFORE INSERT, что означает значение автоинкремента длятекущая строка еще не сгенерирована.

Если вы используете триггер AFTER INSERT, слишком поздно изменить auto_generated_imei.Вы не можете установить значение любого столбца NEW. * В триггере AFTER, потому что он выполняется после того, как строка уже вставлена.

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

Единственное решение - сделать INSERT без значения auto_generated_imei.Позвольте AUTO_INCREMENT выполнить свою работу для генерации одного идентификатора, а затем следуйте INSERT с UPDATE, чтобы изменить столбец auto_generated_imei на нужный вам формат на основе LAST_INSERT_ID(), который сообщит правильное значение вобласть сеанса, из которой вы ее вызываете.

Эта проблема связана с этими предыдущими ответами:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...