【问题标题】:Trigger blocks the INSERT触发器阻止 INSERT
【发布时间】: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

标签: php mysql sql


【解决方案1】:

您不需要为此使用触发器。

您向我们展示的触发器甚至会创建一个无限循环,如果它起作用的话。

只需像这样使用插入查询:
insert into users set (city, tag) values ('LA', concat('HI FROM ', city));

【讨论】:

    【解决方案2】:

    我认为您可以使用 AFTER INSERT 触发器来处理此问题。 让插入发生,然后检查插入到城市列的值。如果它符合您的标准,那么您可以对该行执行更新。

    这有帮助吗?

    【讨论】:

    • 啊,我明白了。抱歉,我没有处理过。我知道这在 SQL Server 中是可能的。祝你好运。
    【解决方案3】:

    在 before 触发器中,NEW 记录是要插入的记录。只需更改您想要的任何字段,该更改将作为正常插入的一部分进入表中。无需执行单独的更新。

            IF (NEW.city= 'LA') THEN
            SET NEW.tag = 'HI FROM LA';
            END IF;
    

    触发器结束,插入行(可能改变了 TAG 字段的值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多