【问题标题】:MySQL Trigger compare all columns in OLD and NEWMySQL触发器比较OLD和NEW中的所有列
【发布时间】:2021-04-27 04:33:41
【问题描述】:

我正在 PHPMyAdmin 中设置产品数据库以直接使用和维护来自 PHPMyAdmin 的数据,我将使用 csv 导出和导入来更新行,我在更新前设置触发器时遇到了困难,该触发器将设置 CURRENT_USER() 为一个列modified_by,它将设置更新该行的 MySQL 用户的用户名。考虑下表products_data 具有列id, name, model, modified_by

CREATE TABLE `products_master`.`products_data` ( 
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(50) NOT NULL , 
    `model` VARCHAR(50) NOT NULL , 
    `modified_by` VARCHAR(50) NOT NULL , 
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

我已经设置了以下触发器,以便在更新前在 modified_by 中设置用户名

CREATE TRIGGER `products_data_before_update` 
BEFORE UPDATE ON `products_data` 
FOR EACH ROW 
    SET NEW.modified_by = CURRENT_USER();

现在,当我使用 PHPMyAdmin 更新行时,它只会在数据发生更改时查询,但是当我使用 csv 文件更新行时,启用选项,在导入时发现重复键时更新数据(添加 ON DUPLICATE KEY UPDATE),在这种情况下,无论哪些行已更改,都会对所有行执行更新查询,在这种情况下,我没有获得 modified_by 的所需功能,因为即使没有行受到影响,用户名也会更新。

因此,在更新用户名之前,我已更改触发器以比较 NEWOLD 中的每一列

CREATE TRIGGER `products_data_before_update` 
BEFORE UPDATE ON `products_data` 
    FOR EACH ROW 
        IF     OLD.id <> NEW.id 
            OR OLD.name <> NEW.name 
            OR OLD.model <> NEW.model 
            OR OLD.modified_by <> NEW.modified_by 
        THEN 
            SET NEW.modified_by = CURRENT_USER(); 
        END IF

我正在比较 OLD 和 NEW 中的每一列以检查该行是否实际更改

我想知道是否有更好的解决方案来解决我的问题,或者直接比较 OLD 和 NEW 中的所有列,这样我就可以在其他表中使用相同的触发器,而无需为每列添加条件

【问题讨论】:

  • 小点 但是id 永远不会改变...会不会
  • @RiggsFolly No id 在上传 csv 的情况下不会改变,但如果你手动执行查询它可能会改变
  • 真的吗?那真的会破坏你的数据库完整性:)
  • @RiggsFolly 是的,我想我可以不检查 id 来做

标签: mysql triggers


【解决方案1】:

我想知道我的问题是否有更好的解决方案

CREATE TRIGGER `products_data_before_update` 
BEFORE UPDATE 
ON `products_data` 
FOR EACH ROW 
SET NEW.modified_by = CASE WHEN    (OLD.id, OLD.name, OLD.model, OLD.modified_by) 
                                != (NEW.id, NEW.name, NEW.model, NEW.modified_by)
                           THEN CURRENT_USER()
                           ELSE NEW.modified_by
                           END;

可能是比较 OLD 和 NEW 中所有行的直接方法,这样我就可以在其他表中使用相同的触发器,而无需为每列添加条件

可能是列,而不是行?

不,这是不可能的。 OLD 和 NEW 是 NOT 表。

【讨论】:

  • @AunRizvi 我怀疑迭代会更快。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 2014-02-15
  • 1970-01-01
  • 2011-06-01
  • 2018-12-19
  • 2018-11-30
  • 2021-10-07
  • 2020-11-10
相关资源
最近更新 更多