我对以下删除查询做错了什么?

时间:2013-08-18 05:29:02

标签: mysql

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

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

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;

2 个答案:

答案 0 :(得分:3)

删除

ORDER by Document.idPerson

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

MySQL中DELETE语句的多表语法是

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

t1t2USING之前)而不是t3删除记录。

所以,你实际上需要使用

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

这可确保仅删除Document条记录,并且Person仅用于指定条件。另请注意,ORDER BYLIMIT不能与多表DELETE一起使用。

答案 1 :(得分: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!
相关问题