2017-03-07 63 views
0

我正在嘗試添加此過程。它給我錯誤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

回答

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

如果您是通過工作臺反對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

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

添加括號:

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