MariaDB中更新表字段时保留DateTime-Bought原值的方法
解决MariaDB中更新Color字段时保留DateTime-Bought原值的方案
方案1:显式将DateTime-Bought设为自身值(推荐)
直接在UPDATE语句中指定DateTime-Bought字段等于它当前的值,大多数触发更新时间的触发器逻辑会判断该字段是否被显式赋值,若已指定则不会覆盖。
执行SQL:
UPDATE `Fruits` SET `Color`='Red', `DateTime-Bought` = `DateTime-Bought` WHERE `Name`='Apple';
这个方案是原子操作,无需额外步骤,能避免并发场景下的不一致问题,是最优解。
方案2:临时禁用触发器(需ALTER权限)
如果有权限,可以先禁用表上的所有触发器,执行更新后再重新启用。注意这个操作会影响表的所有触发逻辑,低并发场景下适用。
执行步骤:
-- 禁用Fruits表的所有触发器 ALTER TABLE `Fruits` DISABLE TRIGGER ALL; -- 执行更新操作 UPDATE `Fruits` SET `Color`='Red' WHERE `Name`='Apple'; -- 重新启用触发器 ALTER TABLE `Fruits` ENABLE TRIGGER ALL;
方案3:修改触发器逻辑(需CREATE/ALTER TRIGGER权限)
如果能修改触发器,可以调整其判断条件,让它仅在未显指定DateTime-Bought时才更新时间。
假设原触发器逻辑为:
CREATE TRIGGER update_fruit_bought_time BEFORE UPDATE ON `Fruits` FOR EACH ROW BEGIN IF NEW.Color <> OLD.Color THEN SET NEW.`DateTime-Bought` = NOW(); END IF; END;
修改为:
CREATE TRIGGER update_fruit_bought_time BEFORE UPDATE ON `Fruits` FOR EACH ROW BEGIN -- 仅当Color变化且未显式设置DateTime-Bought时,才更新时间 IF NEW.Color <> OLD.Color AND NEW.`DateTime-Bought` = OLD.`DateTime-Bought` THEN SET NEW.`DateTime-Bought` = NOW(); END IF; END;
修改后,执行原UPDATE语句或方案1的语句都能保留DateTime-Bought原值。
内容的提问来源于stack exchange,提问作者DataMatrix
相关产品推荐
相关产品推荐

