У меня очень простая база данных со следующей схемой:
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$$
... так как он будет выполнен перед вставкой в *Будет выполнено 1020 * таблиц.
Можно ли каким-либо образом заставить MySQL выполнить триггер после фиксации транзакции?Или я должен создать триггеры для *_referemce
таблиц, которые будут изменять значения в abc_table
?