该表的AUTO_INCREMENT属性不会在插入后每次增加任何值-它卡在特定的整数值上。
我正在本地计算机上测试项目。照原样,我有一个(插入后)触发器,该触发器高度依赖于表的AUTO_INCREMENT属性,因为我正在更新字段并插入带有后缀ID为LAST INSERTED的字符串。但是,无论我运行一次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;
答案 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的表清除缓存