Php MYSQL触发器不工作。不知道为什么

Php MYSQL触发器不工作。不知道为什么,php,mysql,sql,triggers,Php,Mysql,Sql,Triggers,我正在尝试为名为quailmiles的表创建触发器。当总英里数达到某个数字时,我希望更改人员状态(这是同一个表中的一个属性)。由于某种原因,我的代码不起作用 错误当前为: #1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解第9行“”附近要使用的正确语法 我想您想要的是ELSEIF而不是ELSE IF。(删除空格。) 返回错误是因为第二个IF未以END IF结束 另外,您也不想对同一个表发出更新。您希望在更新前触发器中处理此问题,并设置列的值 e、 g 你的逻辑是颠倒的。

我正在尝试为名为quailmiles的表创建触发器。当总英里数达到某个数字时,我希望更改人员状态(这是同一个表中的一个属性)。由于某种原因,我的代码不起作用

错误当前为:

#1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解第9行“”附近要使用的正确语法


我想您想要的是
ELSEIF
而不是
ELSE IF
。(删除空格。)

返回错误是因为第二个
IF
未以
END IF
结束

另外,您也不想对同一个表发出更新。您希望在更新前触发器中处理此问题,并设置列的值

e、 g


你的逻辑是颠倒的。在
2000
之前,您需要针对
4000
进行测试:

delimiter $$
CREATE TRIGGER status_update 
    BEFORE UPDATE ON qualmiles
    FOR EACH ROW
BEGIN
    IF (NEW.total_miles > 4000) THEN
        SET NEW.status = 'platinum';
    ELSEIF (NEW.total_miles > 2000) THEN
        SET NEW.status = 'gold';
    END IF;
END $$
delimiter;

我还将语法更改为“before”更新触发器。此外,我还取名为“鹌鹑”。“Quailmiles”听起来很有趣。

不,错误在最后一行
分隔符中。在
分隔符
之间需要一个空格
@Rahul:IF
语法中肯定有错误,第二个IF没有以IF结尾,这就是#1064错误的根源。还有很多其他的错误。。。尝试更新同一个表,但不使用任何谓词(即更新表中的所有行)。后续的
分隔符
语句失败不会导致触发器定义中出现错误。是的,忽略了这一点,但不要说后续的分隔符语句不会导致错误。除非您没有包含
分隔符
。。。最后一行将始终抛出1064语法错误。可以打赌。@spencer7593那么,当您更新同一个表时,您需要更新所有行吗?@user3723302:触发器不允许修改触发触发器的语句所使用的同一个表。在触发器中,不可能对同一个表发出
UPDATE
语句。即使允许,触发器中的
UPDATE
语句也没有
WHERE
子句;如果允许执行该
UPDATE
语句,它将修改表中的所有行,并在所有行上设置
status
列的值。我尝试了您的代码,但似乎仍然有错误…#1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获取第行“”附近要使用的正确语法10@user3723302,错误在最后一行
分隔符中。添加一个空格。它应该是
分隔符
@Rahul:后续的分隔符语句不是触发器的一部分,也不会导致错误。Gordon没有删除
ELSE IF
中的空格。(戈登还修复了触发器中一些更大的问题。)+1。正如Gordon指出的,这确实需要在更新之前触发。我将更改条件以检查
NEW.total\u miles
,而不仅仅是
total\u miles
。如果
,请删除
中的空格。戈登在这里的方法是正确的。
CREATE TRIGGER status_update 
BEFORE UPDATE ON quailmiles
FOR EACH ROW
BEGIN
   IF (NEW.total_miles > 4000) THEN
      SET NEW.status = 'platinum';
   ELSIF (NEW.total_miles > 2000) THEN
      SET NEW.status = 'gold';
   END IF;
END$$
delimiter $$
CREATE TRIGGER status_update 
    BEFORE UPDATE ON qualmiles
    FOR EACH ROW
BEGIN
    IF (NEW.total_miles > 4000) THEN
        SET NEW.status = 'platinum';
    ELSEIF (NEW.total_miles > 2000) THEN
        SET NEW.status = 'gold';
    END IF;
END $$
delimiter;