我有一个html表单,可以在数据库中发送一些数据。我刚刚创建了一个触发器,每个用 LA 完成 city 字段的人都会添加单词" HI FROM LA"在名为标记的列中。
问题是,在我创建此触发器后,当我尝试提交表单时出现错误:
#1442 - Can't update table 'users' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
触发器是:
DELIMITER |
CREATE TRIGGER update_tag BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF (NEW.city= 'LA') THEN
INSERT INTO users
SET NEW.tag = 'HI FROM LA';
END IF;
END;
|
DELIMITER ;
插入完成:
INSERT INTO users(id, name, city) VALUES(23, "John", "LA")
我有什么其他选择来避免这种冲突?
EDITED TRIGGER:
我还创建了一个名为' trigger'的新表:
DELIMITER |
CREATE TRIGGER update_tag BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF (NEW.city= 'LA') THEN
INSERT INTO trigger
SET NEW.tag = 'HI FROM LA';
END IF;
END;
|
DELIMITER ;
使用此触发器,我在第5行出现错误
答案 0 :(得分:1)
您不需要使用触发器。
你向我们展示的触发器甚至会创建一个无限循环,如果它能够工作的话。
只需使用您的插入查询:
insert into users set (city, tag) values ('LA', concat('HI FROM ', city));
答案 1 :(得分:1)
我认为您可以使用AFTER INSERT触发器来处理此问题。 让插入发生,然后检查插入到city列的值。如果它符合您的条件,那么您可以在该行上执行更新。
这有帮助吗?
答案 2 :(得分:0)
在触发前,新记录是要插入的记录。只需更改您想要的任何字段,该更改将作为正常插入的一部分进入表中。无需执行单独的更新。
IF (NEW.city= 'LA') THEN
SET NEW.tag = 'HI FROM LA';
END IF;
触发器结束,插入行(TAG字段的值可能已更改)。