MySQL创建触发器报#1442错误 无法更新barang表如何解决
MySQL触发器1442报错原因及正确实现方案
报错原因
- 核心是MySQL的内置限制:针对某张表的存储函数/触发器中,不允许直接对该表执行UPDATE/INSERT/DELETE等DML操作,因为触发触发器的原始语句本身就已经在操作这张表,会引发递归调用、死锁等问题,所以直接抛出
#1442错误。你当前触发器中写的UPDATE barang ...语句直接操作了触发器绑定的barang表,正好触发了这个限制。 - 额外逻辑问题:你写的关联条件
t1.barang = t2.kode不符合需求,需求要求的关联条件是barang.kategori = kategori.kode,关联逻辑本身也存在错误。
正确实现方案
你使用的是BEFORE INSERT行级触发器,不需要额外写UPDATE语句修改表,直接对当前待插入行的NEW变量赋值即可,系统会自动把NEW中的值写入最终插入的行里,参考代码如下:
DROP TRIGGER IF EXISTS `update_date`; CREATE DEFINER=`root`@`localhost` TRIGGER `update_date` BEFORE INSERT ON `barang` FOR EACH ROW BEGIN -- 自动填充插入时间 SET NEW.tanggal = NOW(); -- 关联kategori表查询对应的nama,赋值给kategori_nama SELECT nama INTO NEW.kategori_nama FROM kategori WHERE kode = NEW.kategori LIMIT 1; -- 计算折旧价 SET NEW.hargadepresiasi = NEW.hargabeli * 2 / 8; END;
注意事项
- 如果存在
kategori表中没有对应kode的场景,可以增加IF判断为NEW.kategori_nama设置默认值,避免查询无结果报错 - 如果需要在更新
barang表的kategori字段时也同步更新kategori_nama,可以额外创建一个BEFORE UPDATE触发器,复用上述赋值逻辑即可
内容的提问来源于stack exchange,提问作者tryharder
相关产品推荐
相关产品推荐

