【发布时间】: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