Использование события MySQL для «деактивации» учетных записей - PullRequest
0 голосов
/ 11 августа 2011

Я настраиваю базу данных, и один из столбцов в таблице является «статусом» (активен, неактивен, заблокирован).Я хочу, чтобы событие сравнивало 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);
%

Я не осознавал, что события относятся к конкретной базе данных (поэтому вы должны быть в базе данных при ее создании).

Спасибо всем!

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Две вещи, специфичные для события, кроме очевидных синтаксических проблем:

  1. Где заканчивается ваше мероприятие? Вам необходимо заключить его в блок BEGIN / END (так же, как в хранимой процедуре).

  2. Вам необходимо переключать 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, которые разрешены в хранимых процедурах и событиях. USE не допускается.

Еще одно обновление:

Желательно сначала попытаться заставить ваш SQL работать, не помещая его в событие. После того, как вы исправили свои операторы так, чтобы они работали, попробуйте создать из них хранимую процедуру. Когда вы запустите хранимую процедуру, вы можете заменить ее на событие. Таким образом, будет намного легче разобраться с остальными проблемами (например, куда должен идти вывод первого SELECT? И т. Д.).

1 голос
/ 12 августа 2011

Есть ли причина, по которой вы не можете использовать такой запрос?

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

Я никогда не видел FOR EACH в MySQL ...

1 голос
/ 12 августа 2011

Первым шагом будет использование допустимого SQL.

ВЫБРАТЬ "pdate" ИЗ БД namename.tablename ГДЕ "status" = "active";

всегда будет вызывать ошибку, потому что имена столбцов не должны быть в кавычках. Если вы заключите имя таблицы во что-либо, это будет знак обратной черты (`).

ВЫБРАТЬ pdate ОТ базы данных имя_таблицы ГДЕ состояние = "активный";

У вас та же проблема в остальной части вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...