Я настраиваю базу данных, и один из столбцов в таблице является «статусом» (активен, неактивен, заблокирован).Я хочу, чтобы событие сравнивало NOW () со значением столбца "pdate" (которое является отметкой времени), и, если значение превышает 30 дней, обновите значение "status" до "inactive".
Iнаписал следующее, но я получаю несколько синтаксических ошибок: 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
, конечно, «имя базы данных» было заменено реальным именем базы данных, а «имя таблицы» - фактическим именем таблицы.Теперь, по крайней мере, он что-то делает:
+---------------------+
| pdate |
+---------------------+
| 2011-08-11 18:01:02 |
| 2011-08-11 18:03:31 |
+---------------------+
2 rows in set (0.00 sec)
Если я не включил USE databasename;
в строку 2, я не получаю вывод.
ФИНАЛЬНЫЙ КОД:
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);
%
Я не осознавал, что события относятся к конкретной базе данных (поэтому вы должны быть в базе данных при ее создании).
Спасибо всем!