MySQL: вызвать триггер после совершения транзакции - PullRequest
1 голос
/ 11 февраля 2011

У меня очень простая база данных со следующей схемой:

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?

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Вы можете изменить свой триггер на AFTER UPDATE и быстро:

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

для запуска триггера до завершения транзакции.Бонус: если информация о вашем видео обновляется, триггер запускается снова = D.

0 голосов
/ 11 февраля 2011

Триггеры используются именно потому, что они происходят внутри транзакции: если в триггере происходит ошибка, происходит откат всей транзакции, никаких беспорядочных сирот или частичных данных.

Поэтому лучше всего переделать таблицытак что (надеюсь) один триггер на одном столе сделает свое дело.

...