【发布时间】: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 的所需功能,因为即使没有行受到影响,用户名也会更新。
因此,在更新用户名之前,我已更改触发器以比较 NEW 和 OLD 中的每一列
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 来做