2

我想procedure在 MYSQL 中创建一个每小时运行一次delete的表中的所有条目Document。如果这些用户在发布文档时未满 18 岁,我想删除所有访问级别为 5 的文档,如果它们是在一年后由法国人发布的

下面的代码给了我一个错误并告诉我检查我的语法。有没有人对如何修复代码有任何想法,使其成为一个工作程序?

CREATE EVENT hourlydelete
ON SCHEDULE EVERY 1 HOUR
DO CALL delete_Document();

DELIMITER $$ 
CREATE PROCEDURE delete_Document()
BEGIN
    DELETE FROM Document
    WHERE   (Document.idPerson = Person.idPerson AND Person.Country = 'France' AND Document.AccessLevel = 5)
    AND     ((DATEDIFF(Document.Posted,Person.DateOfBirth) / 365) < 18) 
    AND     ((DATEDIFF(NOW(), Document.Posted)/365) > 3)
    ORDER by Document.idPerson

    END
    $$
    DELIMITER;
4

2 回答 2

3

消除

ORDER by Document.idPerson

由于您没有使用SELECT查询,因此没有结果集到ORDER BY.

DELETEMySQL 中多表语句的语法是

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id = t2.id AND t2.id = t3.id;

记录从t1t2(之前USING)中删除但不是t3

所以,你实际上需要使用

DELETE FROM Document USING Document INNER JOIN Person
WHERE ...

这确保只有Document记录被删除并且Person仅用于指定标准。另外,请注意ORDER BYandLIMIT不能与 multi-table 一起使用DELETE

于 2013-08-18T05:35:34.060 回答
2

您在语句;末尾缺少一个分号!DELETE

此外,您的条件似乎是“a) 或 b) 或 c)”,但是AND当您可能需要逻辑时,您已经使用了OR逻辑。

将主要AND运算符更改为OR,并添加分号:

DELETE FROM Document
WHERE (Document.idPerson = Person.idPerson AND Person.Country = 'France' AND Document.AccessLevel = 5)
OR ((DATEDIFF(Document.Posted,Person.DateOfBirth) / 365) < 18) 
OR ((DATEDIFF(NOW(), Document.Posted)/365) > 3); -- Add a semi colon!
于 2013-08-18T05:40:30.813 回答