触发器阻止INSERT

时间:2014-05-22 14:54:43

标签: php mysql sql

我有一个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行出现错误

3 个答案:

答案 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字段的值可能已更改)。