我想在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;
答案 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;
从t1
和t2
(USING
之前)而不是t3
删除记录。
所以,你实际上需要使用
DELETE FROM Document USING Document INNER JOIN Person
WHERE ...
这可确保仅删除Document
条记录,并且Person
仅用于指定条件。另请注意,ORDER BY
和LIMIT
不能与多表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!