MySQL后端更新gsdatatabs表触发触发器报无法更新同表错误如何解决
报错原因
你当前的触发器存在两个问题:
- 触发时机选了
AFTER UPDATE,且在触发器内部直接对同一张表gsdatatabs执行UPDATE操作,这会触发触发器的递归调用,MySQL为了避免出现无限循环、表锁冲突,直接禁止了这类在同表触发器中更新本表的操作,因此抛出了你遇到的报错。 - 你写的UPDATE语句没有加WHERE条件,就算没有触发机制限制,执行后也会把整张表所有行的ALERT字段都修改为当前触发行的LTP值,完全不符合你只修改对应行的需求。
解决方案
将触发器改为BEFORE UPDATE类型,不需要显式执行UPDATE语句,直接对即将写入的行数据的字段赋值即可,具体代码如下:
首先删除原有触发器:
DROP TRIGGER IF EXISTS gsdatatabs_AFTER_UPDATE;
再创建新的触发器:
CREATE DEFINER=`root`@`localhost` TRIGGER `gsdatatabs_BEFORE_UPDATE` BEFORE UPDATE ON `gsdatatabs` FOR EACH ROW BEGIN IF NEW.CAMARILLA = 'B' OR NEW.CAMARILLA = 'S' THEN -- 直接修改即将写入的行的ALERT字段值 SET NEW.ALERT = NEW.LTP; END IF; END
方案说明
BEFORE UPDATE的触发时机是在数据库真正把更新后的数据写入表之前,此时你直接修改NEW对象携带的ALERT字段值,后续数据库写入时会直接使用你修改后的值,既规避了同表更新的冲突,也只会修改当前触发更新的那一行的ALERT值,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Siba Swain
相关产品推荐
相关产品推荐

