2011-02-11 74 views
1

之後,調用觸發我有一個非常簡單的數據庫具有以下模式:MySQL的:事務被提交

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

回答

1

則可以將觸發更改爲更新後,有一個快捷:

UPDATE video SET [email protected] WHERE [email protected]; 

在交易結束之前觸發扳機。獎勵:如果您的視頻信息更新,則觸發器再次運行= D。

+0

有點棘手......但應該做的工作。 – Crozin 2011-02-11 19:26:24

0

觸發器的使用恰恰是因爲它們發生在事務中:如果觸發器中發生錯誤,整個事務回滾,沒有混亂的孤兒或部分數據。

所以最好的辦法是重做表,這樣(希望)在一張桌子上的單個觸發器就可以實現。