我正在使用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);
似乎取决于我是否引用了受影响的字段,也取决于触发器是否可以影响它。我如何做到这一点,即使未指定余额字段也始终生效?如果可能的话,我想使用触发器保留此解决方案。
答案 0 :(得分:1)
因为对于第一个new.balance
,NULL
是INSERT
,所以NEW.balance != NEW.charge
是不正确的。 NULL
上的相等或不相等运算以NULL
表示,这是不正确的,换句话说是false。因此,没有输入THEN
的{{1}}分支。
来自manual:
(...)
您无法使用
IF
,=
或<
之类的算术比较运算符来测试<>
。(...)
由于与
NULL
进行任何算术比较的结果均为NULL
,因此无法从此类比较中获得任何有意义的结果。 在MySQL中,0或NULL表示false,其他表示true。(...)
但是在MySQL中,您可以使用NULL
-安全的相等运算符<=>
。
NULL