【问题标题】:MySQL: Invoke trigger after transaction is committedMySQL:事务提交后调用触发器
【发布时间】:2011-02-11 17:45:32
【问题描述】:

我有一个非常简单的数据库,具有以下架构:

video (id, title, description)
category (id, name)
tag (id, name)

video_category_reference (video_id, category_id)
video_tag_reference(video_id, tag_id)

abc_table (video_id, description, categories)

前五个表使用 InnoDB 引擎。

最后一个表 - abc_table 使用 MyISAM 引擎,它包含某种“缓存”。 description 列存储CONCAT(video.title, video.description, GROUP_CONCAT(tag.name)) 的结果,categories 列存储GROUP_CONCAT(category.id) 的结果。

我需要一个触发器,它会在创建新视频后填充abc_table。将始终以相同的方式创建新视频:

START TRANSACTION;

INSERT INTO video VALUES(NULL, "My video", "description");

SET @vid = (SELECT LAST_INSERT_ID());

INSERT INTO video_category_reference VALUES (@vid, 1), (@vid, 2), (@vid, 3), (@vid, 4);
INSERT INTO video_tag_reference VALUES (@vid, 5), (@vid, 6), (@vid, 7), (@vid, 8);

COMMIT;

很遗憾我不能使用这个触发器:

CREATE TRIGGER after_insert_on_video AFTER INSERT ON video FOR EACH ROW BEGIN
    SET @categories = (SELECT GROUP_CONCAT(category_id) FROM video_category_reference WHERE video_id = NEW.id GROUP BY video_id);
    SET @tags = (SELECT GROUP_CONCAT(t.name) FROM video_tag_reference vtr JOIN tag t ON vtr.tag_id = t.id WHERE video_id = NEW.id GROUP BY video_id);

    INSERT INTO video_search_table VALUES (NEW.id, CONCAT(NEW.title, NEW.raw_description, @tags), @categories);
END$$

...因为它将在 *_reference 表上的插入完成之前执行。


有什么方法可以强制 MySQL 在事务提交后执行触发器?还是我必须为*_referemce 表创建触发器,以修改abc_table 中的值?

【问题讨论】:

    标签: mysql transactions triggers


    【解决方案1】:

    您可以将触发器更改为 AFTER UPDATE 并快速:

    UPDATE video SET id=@vid WHERE id=@vid;
    

    在事务结束之前触发触发器。奖励:如果您的视频信息更新,触发器会再次运行 =D。

    【讨论】:

      【解决方案2】:

      使用触发器正是因为它们发生在事务中:如果触发器中发生错误,则整个事务回滚,没有杂乱的孤儿或部分数据。

      所以最好的办法是重新设计表,以便(希望)一个表上的单个触发器可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2021-12-28
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多