【发布时间】:2014-05-22 14:54:42
【问题描述】:
我有一个在数据库中发送一些数据的 html 表单。我刚刚创建了一个触发器,每个使用 LA 完成 city 字段的人都会在名为 tag 的列中添加单词“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")
我有哪些替代方法可以避免这种冲突?
编辑触发器:
我还创建了一个名为“触发器”的新表:
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 行收到错误
【问题讨论】:
-
触发器中的 INSERT ......这怎么工作?核实。你想更新还是插入?您要修改哪个“用户”行?不应该是 UPDATE 用户... WHERE ...?
-
我很想知道一个优秀的 SQL 开发人员会说些什么。似乎您不能/将无法触发您正在创建的记录的更新。一种解决方法是将标签存储在单独的表中。
-
你正在做的是在一个表中插入,这将在同一个表上触发一个插入。从而形成一个无限循环。
-
@user140102 您不能在您希望触发器对触发触发器的表执行操作的上下文中执行此操作。
-
@user140102 在这种情况下,请使用上面的触发器,但将
INSERT INTO trigger更改为INSERT INTO other_table_name