2015-07-02 77 views
0

我有兩個表在mySQL中,稱他們的評論和產品。然後我有另一張桌子(稱之爲產品大師),這是評論和產品的內在聯繫。我試圖創建一個觸發器來運行內部聯接查詢,當一條新記錄被添加到評論。MySQL觸發與內部聯接

我試圖只將內部連接查詢插入到觸發器中,但它返回一個「#1422 - 存儲函數或觸發器中不允許顯式或隱式提交」。錯誤。爲了清晰的問題,我的觸發代碼是:

CREATE TRIGGER updateprodmaster 
AFTER INSERT ON reviews 
FOR EACH ROW 
BEGIN 
CREATE TABLE productsmaster AS 
SELECT products.*, reviews.userid, reviews.usergender, reviews.userage, reviews.score 
FROM products 
INNER JOIN reviews 
ON products.pid=reviews.pid; 
END;$$ 

如果有人對此有任何想法,將不勝感激。謝謝!

傑克

+0

您使用這裏的3D表'這是沒有加入 – Mihai

+0

道歉user_review.score',我名不副實它應該是「評論」欄。它現在更新。 –

回答

4

CREATE TABLE語句引起的隱式COMMIT。這是不允許的。

對此限制沒有簡單的按鈕解決方法。


但是,即使你能解決這個限制,爲什麼在塑料將要嘗試創建一個新表的每一個行插入的時間?

當第二個行插入,觸發會試圖(再次)創建完全相同的名稱表(因爲該名稱的表已經存在,這將失敗。)

回力車了一點,在馬後面。

並找出你需要滿足什麼要求。

當你回到需要觸發器的時候,你可以在碰到它的時候刻錄該橋。

隨訪

如果目的是試圖將行插入productsmaster表,每當行插入reviews表,INSERT觸發器後使用,我們需要在一個INSERT聲明觸發身體。

該行(剛剛插入到reviews)的列的值在觸發器中可用。沒有必要從reviews表中選擇。我們可以通過排位賽列名與NEW.

我建議避免.*引用新插入的行(INSERT觸發器中後)的列值,並明確命名從products檢索的列。我假設pid列是products中唯一的密鑰(或主鍵)。

舉個例子:

DELIMITER $$ 

CREATE TRIGGER trg_reviews_after_insert 
AFTER INSERT ON reviews 
FOR EACH ROW 
BEGIN 
    INSERT INTO productsmaster (col1, col2, userid, usergender, userage, score) 
    SELECT p.col1 
     , p.col2 
     , NEW.userid 
     , NEW.usergender 
     , NEW.userage 
     , NEW.score 
     FROM products p 
     WHERE p.pid = NEW.pid; 
    END$$ 

DELIMITER $$ 
+0

嗨。感謝您的迴應。當你這樣說時,我可以看到它可能不是最好的計劃。我想我想要做的是更新表(這是兩個表的連接),當一個新的記錄被添加到一個表。觸發器或其他方法是否合適? –

+0

嗨。感謝你的回答。很有用!插口。 –