MySQL的AUTO_INCREMENT没有任何插入查询增加

问题描述 投票:0回答:1

该表的AUTO_INCREMENT属性不被插入后,每任何价值增加 - 这是停留在一个特定的整数值。

我在我的本地计算机上的测试我的项目。因为它是,我有一个(后INSERT)触发器,高度依赖于一个表的AUTO_INCREMENT属性作为我更新的字段和插入与最后插入的ID的字符串所附作为后缀。然而,我不管多少次运行一个INSERT查询,AUTO_INCREMENT的值不会增加。

下面是表的内容是这样的:

这是表的属性/选项值:

我也咨询了INFORMATION_SCHEMA.TABLES但它也说,AUTO_INCREMENT有4价值 - 这应该是技术上的5 ...权?:

我很担心,这个问题可能会在生产服务器上复制的,因为这 - 我的触发高度依赖于“即” AUTO_INCREMENT的价值。有它不解决会导致重复值,这是不能接受的我的工作系统。这是触发定义,取决于AUTO_INCREMENT值:

我期望AUTO_INCREMENT值应等于表的ID字段自动递增启用。在这种情况下,它们(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;
mysql triggers auto-increment information-schema
1个回答
2
投票

我想,你希望auto_generated_imei是基于在imei_id在同一行上生成的ID。

但是,你的触发器是一个BEFORE INSERT触发,这意味着当前行的自动递增值尚未产生。

如果你使用的AFTER INSERT触发,为时已晚修改auto_generated_imei。你可以不设置任何新的价值。*列在AFTER触发,因为该行已经插入后执行。

你也不能可靠地读取AUTO_INCREMENT在你正在做的方式正确INFORMATION_SCHEMA值。该表的AUTO_INCREMENT不会被交易范围的限制。在并发会话运行任何其他刀片将递增AUTO_INCREMENT值,独立于当前会话的交易。你不能用它来预读,你的INSERT将使用当前行只需插入ID。你有一个竞争条件。

唯一的办法是做你不INSERTauto_generated_imei值。让AUTO_INCREMENT开展工作,以生成一个ID,然后按照INSERTUPDATEauto_generated_imei列改为你想要的格式,基于LAST_INSERT_ID()将在你把它叫做会话范围报告正确的值。

此问题与这些过去的答案:

© www.soinside.com 2019 - 2024. All rights reserved.