2015-08-07 2 views
5

Это мой MySQL заявление триггера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, его показывает мне ошибку

enter image description here

Так что может быть проблема. Правильный способ выполнения триггерных запросов?

ответ

3

Я не уверен, если это действительно помогает. Как насчет выполнения каждого запроса отдельно?

$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); 
+0

Спасибо, это сработало отлично ... ура – Matarishvan

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 ; 
+0

Благодаря Рахул. Tats на самом деле опечатка .. – Matarishvan

+0

@Matarishvan, см. Редактирование в ответ, если это помогает. – Rahul

Смежные вопросы