在不包含字段时触发

时间:2018-09-28 18:50:31

标签: mysql triggers

我正在使用MySQL数据库,并且之前没有对触发器做太多工作,但是发现了使用它们的特定情况。我遇到了奇怪的事情。简而言之,除非指定,否则我的触发器不会影响某个字段。我希望有人可以纠正它,使其始终有效。

这是示例代码

DROP TABLE IF EXISTS reservations;
CREATE TABLE reservations(
    resid int(8) NOT NULL AUTO_INCREMENT,
    siteid int(5),
    camperid int(8),
    charge decimal(10,2),
    checkin datetime NOT NULL,
    checkout datetime NOT NULL,
    balance decimal(10,2),
    PRIMARY KEY (resid),
    FOREIGN KEY (siteid) REFERENCES sites(siteid),
    FOREIGN KEY (camperid) REFERENCES campers(camperid)
);

现在是触发器

DELIMETER //
CREATE TRIGGER balanceCheck BEFORE INSERT ON reservations 
FOR EACH ROW 
BEGIN 
   IF NEW.balance != NEW.charge THEN SET NEW.balance = NEW.charge; END IF; 
END;// --this isn't working yet
DELIMETER;

这是触发器无法捕获的SQL

INSERT INTO reservations (resid, siteid, camperid, charge, checkin, checkout)
VALUES (1, 1, 1, 90, '2016-04-10 13:00:00', '2016-04-12 15:00:00');

这是触发器确实捕获的SQL

INSERT INTO reservations (resid, siteid, camperid, charge, checkin, checkout, balance) 
VALUES (2, 1, 1, 90, '2016-04-10 13:00:00', '2016-04-12 15:00:00', 9);

似乎取决于我是否引用了受影响的字段,也取决于触发器是否可以影响它。我如何做到这一点,即使未指定余额字段也始终生效?如果可能的话,我想使用触发器保留此解决方案。

1 个答案:

答案 0 :(得分:1)

因为对于第一个new.balanceNULLINSERT,所以NEW.balance != NEW.charge是不正确的。 NULL上的相等或不相等运算以NULL表示,这是不正确的,换句话说是false。因此,没有输入THEN的{​​{1}}分支。

来自manual

  

(...)

     

您无法使用IF=<之类的算术比较运算符来测试<>

     

(...)

     

由于与NULL进行任何算术比较的结果均为NULL,因此无法从此类比较中获得任何有意义的结果。   在MySQL中,0或NULL表示false,其他表示true。

     

(...)

但是在MySQL中,您可以使用NULL-安全的相等运算符<=>

NULL