在不引发异常的情况下取消MariaDB触发器中的更新

时间:2020-09-24 07:42:43

标签: mysql triggers mariadb

我正在使用MariaDB 10.5创建一个触发器来管理MariaDB表中的版本控制。

当插入新行时,没有什么特别的事情要做。当更新一行时,我想获得以下效果:

  • 此更新不适用于旧行
  • latest列在旧行上更新为false
  • 在新行中插入旧行的数据,并进行更新
  • 新行的latest设置为true,而old_id设置为旧行的id

受约束于idlatestold_id以外的其他列的名称是未知的。

(我知道对版本表有更好的策略-这是一个练习。)

我想到了这个

-- the table
create table cast11_ricette
(
    id int auto_increment key,
    latest tinyint(1) default 1 not null,
    old_id int null,
    f1 int null, int null, ...
);

-- the trigger
delimiter |

CREATE TRIGGER versioning BEFORE UPDATE ON tbl
    FOR EACH ROW
BEGIN
    SET NEW.id = NULL;
    SET NEW.old_id = OLD.id;
    INSERT INTO tbl SELECT NEW;
    -- SET NEW = OLD;  -- this does not work!
    SET NEW.latest = false;
END;
|

delimiter ;

除了不更新旧行,这可以实现所有所需的效果。我考虑的方法是:

  • 手动将NEW中的所有列设置为OLD中的值-可以,但是不满足约束条件
  • 在触发器运行时内省架构,并生成SQL语句以将NEW中的所有列设置为OLD中的值-丑陋!
  • 在最后一条语句中引发错误-仅在非事务引擎中有效,并且有可能破坏检查update s结果的应用程序。

这些方法都不是完全令人满意的。

0 个答案:

没有答案