Mysql 程序:SELECT 和更新

Mysql Procedures: SELECT and UPDATE

我正在尝试添加此过程。它给我错误 1064 (42000) SQL 语法。但我不确定在哪里。

DELIMITER //
 CREATE PROCEDURE disable_expired_users
 BEGIN
   DECLARE @disable_this INT;
   SET @disable_this = SELECT id FROM my_users WHERE TIMESTAMPDIFF(SECOND, NOW(), expire_date) <= 0;
   IF NOT @disable_this IS NULL THEN
     UPDATE my_users SET is_active = 0 WHERE id IN @disable_this;
   END IF;
END; //
SET @disable_this = SELECT id FROM my_users WHERE TIMESTAMPDIFF(SECOND,  
NOW(), expire_date) <= 0;

我觉得问题就出在这里。

尝试

SET @disable_this = (SELECT id FROM my_users WHERE  
TIMESTAMPDIFF(SECOND, NOW(), expire_date) <= 0);

添加括号:

SET @disable_this = (SELECT id FROM my_users WHERE  
TIMESTAMPDIFF(SECOND, NOW(), expire_date) <= 0);

为什么不干脆

DELIMITER //
CREATE PROCEDURE disable_expired_users
BEGIN
    UPDATE my_users
        SET is_active = 0
        WHERE expire_date < NOW();
END; //

甚至更好——不要存储冗余数据(is_active=0 vs expire_date<NOW())——只需在需要检查过期时使用 expire_date<NOW()

如果您被 Workbench 对 UPDATE 的限制所困扰而没有废话,请执行以下操作:

...
BEGIN
    SET @su = @@sql_safe_updates;
    SET sql_safe_updates = OFF;
    ... UPDATEs, etc ...
    SET sql_safe_updates = @su;
END //