MySQL触发器报错1442,能否用存储过程替代?
问题解决:MySQL触发器更新字段报错及存储过程替代方案
一、触发器报错原因及修正
你遇到的1442错误,是因为在BEFORE INSERT触发器里使用了UPDATE语句操作触发表people——MySQL不允许触发器/存储函数在触发它的语句正在使用该表时,再对其进行更新操作。
你的触发器代码完全不需要UPDATE语句,BEFORE INSERT触发器可以直接修改NEW对象的字段值(NEW代表即将插入的行),修正后的触发器代码:
CREATE TRIGGER short_name_trigger BEFORE INSERT ON `people` FOR EACH ROW BEGIN SET NEW.short_name = 'wohahaha'; END
二、存储过程替代方案
如果一定要用存储过程实现,有两种思路:
1. 插入时直接设置字段值
这种方式和修正后的触发器逻辑一致,在插入数据时直接给short_name赋值:
DELIMITER // CREATE PROCEDURE insert_people(IN p_other_field1 VARCHAR(255), IN p_other_field2 INT, ...) BEGIN INSERT INTO `people` (other_field1, other_field2, short_name) VALUES (p_other_field1, p_other_field2, 'wohahaha'); END // DELIMITER ;
调用方式:
CALL insert_people('值1', 123, ...);
(注:p_other_field1等需要替换为你表中实际的其他字段参数)
2. 插入后更新字段
如果需要先插入数据再修改short_name,可以用存储过程完成插入+更新的操作:
DELIMITER // CREATE PROCEDURE insert_and_update_people(IN p_other_field1 VARCHAR(255), IN p_other_field2 INT, ...) BEGIN DECLARE last_insert_id INT; -- 插入数据 INSERT INTO `people` (other_field1, other_field2) VALUES (p_other_field1, p_other_field2); -- 获取刚插入的ID SET last_insert_id = 1405643; -- 更新short_name字段 UPDATE `people` SET short_name = 'wohahaha' WHERE id = last_insert_id; END // DELIMITER ;
调用方式:
CALL insert_and_update_people('值1', 123, ...);
内容的提问来源于stack exchange,提问作者TomLi
相关产品推荐
相关产品推荐

