mysql有没有一条语句可以帮助我知道触发器中的哪一列正在被修改?
我已经尝试过了:
DELIMITER //
CREATE TRIGGER trigger
AFTER UPDATE ON myTable
FOR EACH ROW
IF OLD.ID != NEW.ID THEN
INSERT INTO backupTable
(ID,back_ID) values (NEW.ID,OLD.ID);
END IF
//
DELIMITER;但我的老师说,这是另一种比比较OLD.ID和NEW.ID更有效的方法
发布于 2019-10-11 05:53:40
在MySQL的行级触发器中,不可能直接确定语句中引用了哪些列。MySQL不会让我们访问触发触发器的语句。
在UPDATE触发器中,我们可以访问列的“新”和“旧”值,并且可以进行比较。
给定如下语句:
UPDATE myTable SET fo = IFNULL(fo,0) + 1 WHERE id = 42 ;id的值不会改变,但如果存在匹配的行(或多个行),那么这些行中fo列的值肯定会改变。
要在触发器中检测到这一点,我们需要将OLD.fo与NEW.fo进行比较。我们还应该考虑从NULL到非NULL的更改,反之亦然。
要检测任意数量的列的更改,我们需要检查每一列。
IF ( OLD.id <=> NEW.id )
AND ( OLD.fee <=> NEW.fee )
AND ( OLD.fi <=> NEW.fi )
AND ( OLD.fo <=> NEW.fo )
AND ( OLD.fum <=> NEW.fum ) THEN
-- the values of these columns (id, fee, fi, fo, fum) is not changed
ELSE
-- the value of at least one of the columns id, fee, fi, fo, or fum is changed
END IF零安全比较(宇宙飞船)运算符是MySQL速记
a <=> b等同于:
( ( a IS NOT NULL AND b IS NOT NULL AND a = b ) OR ( a IS NULL AND b IS NULL ) )标准模式是将id列作为代理主键,具有大多数或所有所需的属性:不可为空、简单数据类型、唯一、匿名、不可变、...
更改行的代理id主键值将是非常奇怪的用例。
https://stackoverflow.com/questions/58331009
复制相似问题