【问题标题】:Mysql Error for using Delimiters in triggers在触发器中使用分隔符的 Mysql 错误
【发布时间】:2015-10-30 18:40:47
【问题描述】:

这是我的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 ;

并且查询没有被执行。当我将回显语句粘贴到我的 phpMyadmin 中时,它向我显示了一个错误

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

【问题讨论】:

    标签: php mysql triggers phpmyadmin delimiter


    【解决方案1】:

    不确定是否有任何与 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 ;
    

    【讨论】:

      【解决方案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 );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 2017-12-19
        • 2010-11-19
        • 2011-07-10
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多