根据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 $$

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

原文地址: https://www.cveoy.top/t/topic/bAut 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录