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 ;

И запрос не выполняется. И когда я вставляю echoed заявление в мой phpMyadmin, он показывает мне ошибку

введите описание изображения здесь

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

5

Решение

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

$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 );
3

Другие решения

Не уверен в любой проблеме, связанной с 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

По вопросам рекламы [email protected]