在 MySql 中删除触发器抛出错误 1064

发布于 2024-11-06 18:12:08 字数 519 浏览 5 评论 0原文

尝试运行以下...(MySql 5.5.9)

查询时出现错误(1064):

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”

I get an error (1064) when attempting to run the following... (MySql 5.5.9)

query:

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;

the error is:

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

Any assistance would be great.

Last Edit: Updated to show the 'FOR EACH ROW' and 'BEGIN'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦在深巷 2024-11-13 18:12:08

DELETE之前您缺少FOR EACH ROWhttp://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

触发器可以访问旧的和新的
数据在自己的表中。一个触发器可以
也会影响其他表,但它是
不允许修改一个表
已被使用(用于阅读或
写作)通过调用的语句
函数或触发器。

由于您没有使用 OLDNEW,我认为您无法修改 chat,因为触发器是在插入 时触发的>聊天

You're missing FOR EACH ROW before DELETE: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

Edit: There are more issues. The correct syntax is below:

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 ;

Edit 2:

I don't think that query is allowed to be in a trigger at all based on this http://dev.mysql.com/doc/refman/5.1/en/faqs-triggers.html#qandaitem-B-5-1-9:

A trigger can access both old and new
data in its own table. A trigger can
also affect other tables, but it is
not permitted to modify a table that
is already being used (for reading or
writing) by the statement that invoked
the function or trigger.

Since you aren't using OLD or NEW, I don't think you can modify chat since the trigger is triggered on inserts to chat.

日记撕了你也走了 2024-11-13 18:12:08

我对以下语句也遇到了同样的问题,即使是这个简化的删除语句,它也总是给我一个语法错误(最初是 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 ;

I had the same problem with the following statement, it ALWAYS gave me a syntax error on even this simplified delete statement (originally was 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

If I changed the SQL command to the following then it WORKED but I don't understand why:

DELIMITER $

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

DELIMITER ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文