УДАЛИТЬ ТРИГГЕР в MySql ошибка 1064 - PullRequest
1 голос
/ 13 мая 2011

Я получаю ошибку (1064) при попытке запустить следующее ... (MySql 5.5.9)

запрос:

CREATE TRIGGER clearChat AFTER INSERT ON chat
FOR EACH ROW
BEGIN
DELETE p.* FROM chat p LEFT JOIN (SELECT t.id FROM chat t ORDER BY t.id DESC LIMIT 50) x ON x.id = p.id WHERE x.id IS NULL
END;

ошибка:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 5

Любая помощь будет отличной.

Последнее редактирование: обновлено, теперь отображаются 'FOR EACH ROW' и 'BEGIN'

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Вам не хватает FOR EACH ROW до DELETE: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

Редактировать: Есть еще проблемы.Правильный синтаксис приведен ниже:

delimiter |

    CREATE TRIGGER clearChat AFTER INSERT ON chat
      FOR EACH ROW BEGIN
        DELETE p.* FROM chat p LEFT JOIN (SELECT t.id FROM chat t ORDER BY t.id DESC LIMIT 50) x ON x.id = p.id WHERE x.id IS NULL;
      END;
|

delimiter ;

Редактировать 2:

Я не думаю, что запрос вообще может быть в триггере на основании этого http://dev.mysql.com/doc/refman/5.1/en/faqs-triggers.html#qandaitem-B-5-1-9:

Триггер может обращаться к старым и новым данным в своей собственной таблице.Триггер также может влиять на другие таблицы, но нельзя изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер.

Поскольку вы неНе используете OLD или NEW, я не думаю, что вы можете изменить chat, так как триггер срабатывает на вставках до chat.

1 голос
/ 20 августа 2011

У меня была та же проблема со следующим оператором, он ВСЕГДА выдавал мне синтаксическую ошибку даже в этом упрощенном операторе удаления (изначально было DELETE FROM APP_CACHE_VIEW WHERE APP_UID = OLD.APP_UID;):

CREATE TRIGGER APPLICATION_DELETE BEFORE DELETE ON APPLICATION
FOR EACH ROW
BEGIN
DELETE FROM APP_CACHE_VIEW;
END

Если я изменил команду SQL на следующую, то она РАБОТАЛА, но я не понимаю, почему:

DELIMITER $$

CREATE TRIGGER APPLICATION_DELETE BEFORE DELETE ON APPLICATION
FOR EACH ROW
BEGIN
DELETE FROM APP_CACHE_VIEW;
END$$

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...