2015-01-01 78 views
2

我正在嘗試創建一個非常簡單的MySQL觸發器,用於在一個表(螺絲)上插入或更新一行。當我運行查詢來創建觸發器時,我想我已經非常接近它,它只是失敗並說錯誤,沒有什麼可以指向正確的方向。MYSQL觸發器錯誤,

這是我到目前爲止,我只想在表格中取兩列的值,並將它們相乘,然後將結果更新到第三列,我希望在添加新記錄時發生這種情況或在此表中編輯。我嘗試過儘可能匹配我所見過的一些例子,但沒有任何東西似乎完全匹配。

delimiter // 
CREATE TRIGGER estimate 
AFTER INSERT ON `Screws` FOR EACH ROW 
begin 
UPDATE Screws SET Quantity = Weight * num_per_ounce; 
end; 
delimiter ; 
+0

在你的標題中你寫了一個錯誤,錯誤是什麼?它是否有消息和/或數字? – hakre

+1

感謝您的回覆,錯誤沒有其他信息,只是「錯誤」。這是我發佈的部分原因。 – The08jayhawk

回答

2

如果你想改變同桌你在哪裏插入行,那麼就不要使用 INSERT觸發器。相反,使用前插入觸發:

delimiter // 
CREATE TRIGGER screws_insert 
BEFORE INSERT ON `Screws` FOR EACH ROW 
begin 
    SET new.Quantity = new.Weight * new.num_per_ounce; 
end; 
delimiter ; 

你基本上是試圖添加計算列,其中MySQL不直接支持。

如果你想爲update觸發爲好,那麼你就需要兩個觸發器:

delimiter // 
CREATE TRIGGER screws_update 
BEFORE UPDATE ON `Screws` FOR EACH ROW 
begin 
    SET new.Quantity = new.Weight * new.num_per_ounce; 
end; 
delimiter ; 

通知我改變了觸發名稱,包括表。這通常是幫助跟蹤觸發器的良好實踐。

+0

謝謝Gordon,你的解釋很清楚,我會盡快實施。作爲一個側面說明,自從我在這裏以來,它已經有一段時間了,但upvote按鈕在哪裏? – The08jayhawk

+0

快速更新,我能夠使第一個聲明工作,但它似乎MySQL版本我不允許我有相同的事情多個觸發器,所以我想我是有限的,除非我可以設置它運行在更新或插入,我不認爲我的快速審判工作。也許使用CHANGE而不是UPDATE或INSERT會導致所需的行爲? – The08jayhawk

0

好的,我會發布我的最終解決方案給其他任何有類似問題的人。

原來我忘了在另一個觸發器中更改觸發器操作,所以我現在都在運行。這是我的最終代碼,我添加了一個檢查來防止它在它檢查的兩個字段中沒有數據輸入的情況下運行。

CREATE TRIGGER screws_insert 
BEFORE INSERT ON `Screws` FOR EACH ROW 
begin 
IF new.Weight AND new.num_per_ounce IS NOT NULL THEN 
    SET new.Quantity = new.Weight * new.num_per_ounce; 
END IF; 
end; 

CREATE TRIGGER screws_update 
BEFORE UPDATE ON `Screws` FOR EACH ROW 
begin 
IF new.Weight AND new.num_per_ounce IS NOT NULL THEN 
    SET new.Quantity = new.Weight * new.num_per_ounce; 
END IF; 
end; 

確保在運行SQL之前將分隔符設置爲//。 感謝爲此解決方案做出貢獻的兩位用戶!