首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql触发器中,有没有办法知道哪一列正在更新?

问在mysql触发器中,有没有办法知道哪一列正在更新?
EN

Stack Overflow用户
提问于 2019-10-11 04:58:54
回答 1查看 189关注 0票数 0

mysql有没有一条语句可以帮助我知道触发器中的哪一列正在被修改?

我已经尝试过了:

代码语言:javascript
复制
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更有效的方法

EN

回答 1

Stack Overflow用户

发布于 2019-10-11 05:53:40

在MySQL的行级触发器中,不可能直接确定语句中引用了哪些列。MySQL不会让我们访问触发触发器的语句。

在UPDATE触发器中,我们可以访问列的“新”和“旧”值,并且可以进行比较。

给定如下语句:

代码语言:javascript
复制
UPDATE myTable SET fo = IFNULL(fo,0) + 1 WHERE id = 42 ;

id的值不会改变,但如果存在匹配的行(或多个行),那么这些行中fo列的值肯定会改变。

要在触发器中检测到这一点,我们需要将OLD.fo与NEW.fo进行比较。我们还应该考虑从NULL到非NULL的更改,反之亦然。

要检测任意数量的列的更改,我们需要检查每一列。

代码语言:javascript
复制
  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速记

代码语言:javascript
复制
a <=> b

等同于:

代码语言:javascript
复制
( ( a IS NOT NULL AND b IS NOT NULL AND a = b ) OR ( a IS NULL AND b IS NULL ) )

标准模式是将id列作为代理主键,具有大多数或所有所需的属性:不可为空、简单数据类型、唯一、匿名、不可变、...

更改行的代理id主键值将是非常奇怪的用例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58331009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档