MySQL Error 1442:phpMyAdmin中books表触发器更新同表报错如何解决
报错原因
你收到1442报错是因为MySQL的内置限制:触发器是由books表的插入操作触发的,不能在触发器内部再对books表执行UPDATE这类DML操作,避免出现递归调用、资源抢占死锁的问题。
解决方案
你要实现的「插入时自动把availableCopies设为和totalCopies相等」的需求,不需要用到AFTER INSERT加UPDATE的逻辑,改成BEFORE INSERT触发器直接修改待插入的行数据即可,完全规避同表更新冲突,性能也更高。
正确的触发器代码如下:
DELIMITER // CREATE TRIGGER tBookCopies BEFORE INSERT ON books FOR EACH ROW BEGIN SET NEW.availableCopies = NEW.totalCopies; END // DELIMITER ;
补充说明:
NEW关键字代表即将插入的新行数据,在BEFORE INSERT阶段修改NEW的字段值,修改后的内容会和其他字段一起写入表中,不需要额外执行UPDATE语句。
验证方法
创建上述触发器后,执行一条插入测试语句:
INSERT INTO books (book_ID, totalCopies, 其他必填字段) VALUES (测试ID, 10, ...);
查询该条记录可以看到availableCopies会自动被赋值为10,和totalCopies一致。
内容的提问来源于stack exchange,提问作者Esther Iyege
相关产品推荐
相关产品推荐

