MySQL中三个以上的排除子句没有触发触发器



我正在编写一个查询来跟踪基于触发器的几个表中的变化,因为我们有用户直接通过前端访问数据库。我已经编写了一个触发器,它验证我们不关心的列不会被触摸,但是当我向if not语句添加超过三个列时,触发器突然停止触发。这是MySQL的限制还是我做错了什么?谢谢!

下面是ChangesTracker表模式:

CREATE TABLE `Test_Automation`.`ChangesTracker` (
`tracking_id` INT NOT NULL AUTO_INCREMENT,
`table_name` VARCHAR(45) NOT NULL,
`timestamp` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`Operation` VARCHAR(45) NOT NULL,
`tracking_query` VARCHAR(1024) NOT NULL COMMENT '''',
`tracking_user_id` VARCHAR(45) NOT NULL,
`uuid` VARCHAR(45) NOT NULL,
PRIMARY KEY (`tracking_id`))
COMMENT = 'Table for tracking SQL update and delete statements executed into the database to monitor changes.';

然后触发本身:

/*********************/
DROP TRIGGER IF EXISTS sample_table_log_update;
DELIMITER |
CREATE TRIGGER sample_table_log_update 
BEFORE UPDATE ON `sample_table`
FOR EACH ROW
IF NOT ((NEW.excluded <> OLD.excluded) OR (NEW.reserved <> OLD.reserved) OR (NEW.healthy <> OLD.healthy) OR (NEW.router <> OLD.router)) THEN
BEGIN
DECLARE original_query VARCHAR(1024);
SET original_query = (SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID());
INSERT INTO `ChangesTracker`(`table_name`, `timestamp`, `operation`, `tracking_query`, `tracking_user_id`, `uuid`) VALUES ('sample_table', CURRENT_TIMESTAMP, 'Update', original_query, CURRENT_USER, old.uuid);
END;
END IF
;
|

研究表明,98.67% +/- 7.29%的病例是由null值引起的:

不能使用算术比较运算符,如=、<或><>来测试是否为NULL。[…因为任何与NULL的算术比较的结果也是NULL,你不能从这样的比较中得到任何有意义的结果。

null<>进行比较将返回null,而IF NOT (null)永远不满足。由于第四次比较会给您带来麻烦,我假设NEW.routerOLD.router都是null

可以使用null安全的等号来表示<=>:

空值相等。该操作符执行与=操作符类似的相等比较,但如果两个操作数都为NULL,则返回1而不是NULL,如果一个操作数为NULL,则返回0而不是NULL。

请注意<=>检查是否相等(即使它可能看起来与<>相似),因此例如(NEW.excluded <> OLD.excluded)将转换为!(NEW.excluded <=> OLD.excluded)

最新更新