我设置了一个数据库,表中的一列是“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);
%
我没有意识到事件是特定于数据库的(因此在创建时必须在数据库中)。
全部谢谢!
答案 0 :(得分:2)
除了明显的语法问题之外,还有两个特定事件:
您的活动在哪里结束?您需要将其括在BEGIN / END块中(与存储过程相同)。
定义事件时需要切换DELIMITER(与定义存储过程时相同)。
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 ......