在任何INSERT查询中,MySQL AUTO_INCREMENT不会增加

时间:2019-02-04 21:30:54

标签: mysql triggers auto-increment information-schema

该表的AUTO_INCREMENT属性不会在插入后每次增加任何值-它卡在特定的整数值上。

我正在本地计算机上测试项目。照原样,我有一个(插入后)触发器,该触发器高度依赖于表的AUTO_INCREMENT属性,因为我正在更新字段并插入带有后缀ID为LAST INSERTED的字符串。但是,无论我运行一次INSERT查询多少次,AUTO_INCREMENT值都不会增加。

这是表的内容: table content

这是表的属性/选项值: table properties/option values

我也参考了information_schema.TABLES,但是它也说AUTO_INCREMENT的值为4-从技术上来说应该为5 ...对吗? information_schema.TABLES

我担心此问题可能会在生产服务器上复制,因为这-我的触发器高度依赖于“那个” AUTO_INCREMENT的值。如果不解决,将导致重复的值,这对于我正在使用的系统是不可接受的。这是取决于AUTO_INCREMENT值的触发器定义: Trigger Definition

我希望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;

2 个答案:

答案 0 :(得分:1)

我假设您希望auto_generated_imei基于同一行中imei_id中生成的ID。

但是您的触发器是BEFORE INSERT触发器,这意味着尚未生成当前行的自动增量值。

如果要使用AFTER INSERT触发器,则修改auto_generated_imei为时已晚。您无法在AFTER触发器中设置任何NEW。*列的值,因为它是在插入行之后执行的。

您也无法以自己的方式可靠地从AUTO_INCREMENT读取正确的INFORMATION_SCHEMA值。表的AUTO_INCREMENT不受事务范围的限制。在并发会话中运行的任何其他插入将独立于当前会话的事务而增加AUTO_INCREMENT的值。您不能使用它来预读INSERT将用于其当前插入行的ID。您有比赛条件。

唯一的解决方案是在没有INSERT值的情况下执行auto_generated_imei。让AUTO_INCREMENT进行工作以生成一个id,然后在INSERT后面加上一个UPDATE,以根据{{ 1}},它将在您调用它的会话范围内报告正确的值。

此问题与以前的答案有关:

答案 1 :(得分:0)

尝试

ANALYZE TABLE `my_table`;
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE (TABLE_NAME = 'my_table');

BD的表清除缓存