Mysql过程:SELECT和UPDATE

问题描述:

我正在尝试添加此过程。它给我错误1064(42000)SQL语法。但我不知道在哪里。Mysql过程:SELECT和UPDATE

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; // 
+1

错误应包括字符位置。 – user5226582

为什么不干脆

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()

如果您是通过工作台反对UPDATE限制无负担等等等等,做这样的事情:

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

那么,如果我只在我的mysql工作台中运行UPDATE部分,它会说我不能更新没有使用ID的WHERE,并且我必须禁用安全模式,以及bla bla bla。如果我在一个过程中创建它,它会以任何方式运行吗? – tmorais

+0

我不这么认为。我添加了3行来解决它(在Proc中)。 –

+0

男人,我从来没有通过我会从我的问题得到这么多的回应。我很高兴这里的每个人都渴望提供帮助。谢谢。我会尝试的。我猜这也适用于触发器,对吧? – tmorais

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);