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

MySql抛出错误1064中的删除触发器,mysql,mysql-error-1064,Mysql,Mysql Error 1064,我在尝试运行以下程序时遇到错误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 e

我在尝试运行以下程序时遇到错误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”:

编辑:还有更多问题。正确的语法如下所示:

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:

基于此,我认为根本不允许在触发器中使用查询:

触发器可以访问旧的和新的 数据在它自己的表中。扳机可以 也会影响其他表,但它是 不允许修改以下表格: 已被用于阅读或 通过调用 触发器功能或触发器

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

删除之前,您缺少每一行:

编辑:还有更多问题。正确的语法如下所示:

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:

基于此,我认为根本不允许在触发器中使用查询:

触发器可以访问旧的和新的 数据在它自己的表中。扳机可以 也会影响其他表,但它是 不允许修改以下表格: 已被用于阅读或 通过调用 触发器功能或触发器


由于您没有使用旧的或新的,我不认为您可以修改聊天,因为触发器是在插入聊天时触发的。

我对以下语句有同样的问题,它总是给我一个语法错误,即使这个简化的delete语句最初是从APP\u CACHE\u视图中删除的,其中APP\u UID=OLD.APP\u UID;:

如果我将SQL命令更改为以下命令,那么它可以工作,但我不明白为什么:

DELIMITER $$

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

DELIMITER ;

我对下面的语句也有同样的问题,它总是给我一个语法错误,即使这个简化的delete语句最初是从APP_CACHE_视图中删除的,其中APP_UID=OLD.APP_UID;:

如果我将SQL命令更改为以下命令,那么它可以工作,但我不明白为什么:

DELIMITER $$

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

DELIMITER ;

我记得这是一个可选命令。添加它之后,我得到一个错误:您的SQL语法有一个错误;检查与MySQL服务器版本对应的手册,以了解第行“END”附近使用的正确语法4@JClaspill它不是可选的,如我发布的链接所示。编辑为包含分隔符部分,并在delete语句后添加分号。我可以添加它,但它似乎从未触发。所以你在这里得到了一点解决的答案,但好奇的是,如果你注意到我做了什么错事,让它不触发,或者如果它触发了,它在触发时不会做任何事情?@JClaspill没有看到你的数据,很难判断。选择p.*从聊天室p左连接选择t.id从聊天室t按t.id描述顺序限制50 x ON x.id=p.id,其中x.id为空;return?它给我一个最新50行之外的结果集。我记得这是一个可选命令。添加它之后,我得到一个错误:您的SQL语法有一个错误;检查与MySQL服务器版本对应的手册,以了解第行“END”附近使用的正确语法4@JClaspill它不是可选的,如我发布的链接所示。编辑为包含分隔符部分,并在delete语句后添加分号。我可以添加它,但它似乎从未触发。所以你在这里得到了一点解决的答案,但好奇的是,如果你注意到我做了什么错事,让它不触发,或者如果它触发了,它在触发时不会做任何事情?@JClaspill没有看到你的数据,很难判断。选择p.*从聊天室p左连接选择t.id从聊天室t按t.id描述顺序限制50 x ON x.id=p.id,其中x.id为空;return?它给了我一个最新50行以外的结果集。我让PHP在输入开始时而不是在触发器处执行此操作,正如Chris Morgan在下面发现的那样,触发器似乎不适合我的具体场景。我让PHP在输入开始时而不是在触发器处执行此操作,正如克里斯·摩根(Chris Morgan)在下面发现的那样,触发器似乎不适用于我的确切场景。