gpt4 book ai didi

mysql - 不包含字段时触发

转载 作者:行者123 更新时间:2023-11-29 10:02:49 24 4
gpt4 key购买 nike

我正在开发一个 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);

似乎取决于我是否引用受影响的字段或触发器是否可以影响它。我怎样才能使余额字段始终受到影响,即使未指定也是如此?如果可能的话,我希望使用触发器来保留此解决方案。

最佳答案

因为new.balanceNULL对于第一个INSERT , NEW.balance != NEW.charge不是真的。 NULL 上的等式或不等式运算结果为 NULL ,这不是真的,换句话说是假的。接下来,THEN IF的分支未输入。

来自manual :

(...)

You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL.

(...)

Because the result of any arithmetic comparison with NULL is also NULL, you cannot obtain any meaningful results from such comparisons. In MySQL, 0 or NULL means false and anything else means true.

(...)

但是在MySQL中你可以使用NULL -安全等于运算符 <=> .

CREATE TRIGGER balanceCheck
BEFORE INSERT
ON reservations
FOR EACH ROW
BEGIN
IF NOT NEW.balance <=> NEW.charge THEN
SET NEW.balance = NEW.charge;
END IF;
END;

关于mysql - 不包含字段时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52561151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com