CREATE TRIGGER cbu BEFORE UPDATE ON c FOR EACH ROWBEGIN DECLARE status_value BIT1; SELECT status INTO status_value FROM c WHERE username = OLDusername AND username = OLDcontact; IF status_value = 0
根据MySQL的文档,在SELECT INTO语句中,如果查询结果为空,则会将变量赋值为NULL。因此,如果在子查询中找不到符合条件的行,则status_value将被赋值为NULL。
在这种情况下,IF语句中的条件将被解释为FALSE,因此不会执行UPDATE语句。为了避免这种情况,可以在声明status_value变量时将其初始化为0,即使查询结果为空,status_value的值也会为0,IF语句将会按照预期执行。
以下是修改后的代码:
CREATE TRIGGER cbu BEFORE UPDATE ON c FOR EACH ROW
BEGIN
DECLARE status_value BIT(1) DEFAULT 0;
SELECT status INTO status_value FROM c WHERE username = OLD.username AND username = OLD.contact;
IF status_value = 0 THEN
UPDATE p SET
contacts = contacts + IF(username = NEW.contact OR username = NEW.username, 1, 0),
contactrequests = contactrequests - IF(contactrequests > 0 AND username = NEW.username, 1, 0),
contactrequested = contactrequested - IF(contactrequested > 0 AND username = NEW.contact, 1, 0)
WHERE username IN (NEW.username, NEW.contact);
ELSE
SIGNAL SQLSTATE '45002' SET MESSAGE_TEXT = OLD.username;
END IF;
END $$
原文地址: https://www.cveoy.top/t/topic/bAut 著作权归作者所有。请勿转载和采集!