使用触发器中的分隔符导致Mysql错误

4

这是我的MySQL触发器语句

DELIMITER |
CREATE TRIGGER kk AFTER UPDATE
    ON location FOR EACH ROW
 BEGIN
        IF NEW.name not in(SELECT A.name FROM filter A  WHERE (NEW.name = A.name))THEN  

        IF NEW.location_name != OLD.location_name THEN
            INSERT INTO filter(old_location_name,new_location_name) 
            VALUES (OLD.location_name, NEW.location_name);

        ELSE
            
                UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name;  

        END IF; 

        ELSE

            UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name;

  
        END IF; 
              
  END;|
DELIMITER ;

当我将这段代码粘贴到phpMyadmin中时,它可以正常工作。而在我的项目中:
$sqlDrop = "DROP TRIGGER IF EXISTS `kk`";       
$resDrop = parent::_executeQuery($sqlDrop); 

echo $sql = "same above delimiter trigger query";
$rs = parent::_executeQuery($sql );

现在,$sql语句以单行形式输出。
 DELIMITER | CREATE TRIGGER kk AFTER UPDATE ON location FOR EACH ROW BEGIN IF NEW.name not in(SELECT A.name FROM filter A  WHERE (NEW.name = A.name))THEN IF NEW.location_name != OLD.location_name THEN INSERT INTO filter(old_location_name,new_location_name,name) VALUES (OLD.location_name, NEW.location_name);    ELSE UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; END IF; ELSE UPDATE filter SET old_location_name = OLD.location_name , new_location_name = NEW.location_name WHERE name = OLD.name; END IF; END;| DELIMITER ;

查询没有执行。当我将echo语句粘贴到phpMyadmin中时,它显示了一个错误。

enter image description here

那么问题可能是什么呢?这是执行触发器查询的正确方法吗?

2个回答

2
我不确定这是否真的有帮助。如何单独执行每个查询?
$startDelimit = 'DELIMITER |';
$resStart = parent::_executeQuery($startDelimit);

然后您创建触发器语句。
$sql = "CREATE TRIGGER kk AFTER UPDATE ...... END IF; END;";
$rs = parent::_executeQuery($sql );

然后是最后一句话。

$endDelimit = '| DELIMITER ;';
$resEnd = parent::_executeQuery($endDelimit );

2

如果您对任何与PHP相关的问题不确定,可以尝试修改您的触发器代码如下:

DELIMITER |
CREATE TRIGGER kk AFTER UPDATE
    ON location FOR EACH ROW
 BEGIN
        IF NEW.name not in(SELECT A.name FROM filter A  WHERE NEW.name = 
A.name) AND NEW.location_name != OLD.location_name THEN      
            INSERT INTO filter(old_location_name,new_location_name) 
            VALUES (OLD.location_name, NEW.location_name);    
        ELSE    
                UPDATE filter SET old_location_name = OLD.location_name ,
 new_location_name = NEW.location_name WHERE name = OLD.name;      
        END IF;     
END;|
DELIMITER ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接