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 //
我正在尝试添加此过程。它给我错误 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 //