Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 触发器阻止插入_Php_Mysql_Sql - Fatal编程技术网

Php 触发器阻止插入

Php 触发器阻止插入,php,mysql,sql,Php,Mysql,Sql,我有一个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/tri

我有一个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行得到了一个错误,您不需要为此使用触发器

你向我们展示的触发器,如果它起作用的话,甚至会产生一个无止境的循环

只需像这样使用插入查询:

插入用户设置(城市,标签)值('LA',concat('HI FROM',city))

我认为您可以使用后插入触发器来处理此问题。 让插入发生,然后检查在city列中插入的值。如果它符合您的条件,则可以对该行执行更新


这有用吗

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

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

触发器结束时,插入行(标记字段的值可能已更改)。

触发器中的插入。。。这怎么行?检查一下。您要更新还是插入?您要修改哪个“用户”行?这不应该是一个更新用户。。。哪里…?我很想知道一个好的SQL开发人员会说些什么。似乎您无法/将无法触发正在创建的记录的更新。一种解决方法是将标记存储在一个单独的表中。您所做的是在一个表中插入,该表将触发对同一个表的插入。这样就创建了一个无休止的循环。@user140102您不能在您希望触发器对触发触发器的表执行操作的上下文中执行该操作。@user140102在这种情况下,请使用上面的触发器,但将
INSERT-INTO-trigger
更改为
INSERT-INTO-other\u-table\u-name
啊,我明白了。对不起,我没用过。我知道这在SQL Server中是可能的。祝你好运