MySQL:提交事务后调用触发器

时间:2011-02-11 17:45:33

标签: mysql transactions triggers

我有一个非常简单的数据库,其中包含以下架构:

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中的值?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

相关问题