我有一个非常简单的数据库,其中包含以下架构:
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
中的值?
答案 0 :(得分:1)
您可以将触发器更改为AFTER UPDATE并快速执行:
UPDATE video SET id=@vid WHERE id=@vid;
在事务结束前触发触发器。奖励:如果您的视频信息更新,则触发器再次运行= D.
答案 1 :(得分:0)
触发器的使用正是因为它们出现在事务中:如果触发器中发生错误,整个事务就会回滚,没有凌乱的孤儿或部分数据。
所以最好的办法就是重做表格,以便(希望)一个表上的单个触发器可以解决问题。