使用MySQL事件“停用”帐户

时间:2011-08-11 19:55:25

标签: mysql sql events sql-update

我设置了一个数据库,表中的一列是“status”(活动,非活动,已锁定)。我希望事件将NOW()与列“pdate”(这是一个时间戳)的值进行比较,如果超过30天,则将“status”的值更新为“inactive”。

我写了以下内容,但是我得到了一些语法错误:s

CREATE EVENT `expireAccounts_oldPwd` ON SCHEDULE EVERY DAY
DO
USE databasename;
SELECT pdate FROM tablename WHERE status = "active";
FOR EACH ( ROW IN tablename WHERE( ( SELECT DATEDIFF(NOW(),pdate) AS age ) > 30 ) ) {
    UPDATE tablename SET status = "inactive";
};

ERROR 1064 (42000): You have an error in your SQL syntax near 'USE databasename' at line 2
ERROR 1064 (42000): You have an error in your SQL syntax near 'FOR EACH ROW IN "tablename" WHERE( ( SELECT DATEDIFF(NOW(),"pdate") AS age )' at line 4
ERROR 1064 (42000): You have an error in your SQL syntax near '}' at line 6

当然'databasename'被替换为实际数据库的名称,'tablename'被替换为实际表的名称。 现在至少它正在做一些事情:

+---------------------+
| pdate               |
+---------------------+
| 2011-08-11 18:01:02 |
| 2011-08-11 18:03:31 |
+---------------------+
2 rows in set (0.00 sec)

如果我在第2行没有包含USE databasename;,我就没有输出。

最终代码:

USE databasename;
DELIMITER %
CREATE EVENT eventname
   ON SCHEDULE EVERY 1 DAY
DO UPDATE tablename SET status = "inactive" WHERE status = "inactive" AND DATEDIFF(NOW(), columnname) > 30);
%

我没有意识到事件是特定于数据库的(因此在创建时必须在数据库中)。

全部谢谢!

3 个答案:

答案 0 :(得分:2)

除了明显的语法问题之外,还有两个特定事件:

  1. 您的活动在哪里结束?您需要将其括在BEGIN / END块中(与存储过程相同)。

  2. 定义事件时需要切换DELIMITER(与定义存储过程时相同)。

  3. http://dev.mysql.com/doc/refman/5.1/en/create-event.html末尾有两个相关的例子。

    <强>更新

    同时检查http://dev.mysql.com/doc/refman/5.1/en/stored-routines-syntax.html以查找存储过程和事件中允许的SQL语句。 <{1}}是不允许的。

    又一次更新:

    建议首先尝试让SQL工作而不将其置于事件中。修复语句以使其工作后,尝试从中创建存储过程。当您使存储过程正常工作时,您可以将其替换为事件。通过这种方式,可以更容易地解决其余问题(例如第一个USE的输出应该去哪里?等等。)

答案 1 :(得分:1)

第一步将使用有效的SQL。

  

SELECT“pdate”FROM databasename.tablename WHERE“status”=“active”;

总是会导致错误,因为列名不应该在引号中。如果你把一个表名包含在任何东西中,它就是反引号(`)。

  

SELECT pdate FROM databasename.tablename WHERE status =“active”;

您在查询的其余部分遇到同样的问题。

答案 2 :(得分:1)

是否有理由不能使用像这样的查询?

UPDATE tablename SET status = "inactive" WHERE status = "active" AND DATEDIFF(NOW(),pdate) > 30;

我从来没有在MySQL中看到FOR FOR EACH ......