2016-02-21 42 views
0

我需要一些幫助來獲得在PHPmyAdmin中定義觸發器的語法。 我有什麼: 2表 - 發票和invoiceitem tbl_invoice有一個字段「總計」欄應顯示錶invoiceitemPHPmyAdmin mySQL觸發器:當子表被插入,更新或刪除時更新父表

tbl_invoiceitem有2個觸發更新「擴展」 before_insert的「擴展」價格的總和和before_update

我盡力去完成什麼:

計算所有項目的總和發票,要麼插入新項目後或價格或數量用於現有項目更新tbl_invoice的「合計」價格已更新。

我試圖在PHPmyAdmin中做到這一點。

enter image description here

的錯誤消息是

enter image description here

我希望有人可以給MT上的提示到正確的方向。剛開始觸發器,似乎沒有找到解決方案與搜索互聯網幾天。

非常感謝您的幫助。

乾杯,奧利弗

+0

不改變分隔符。 –

回答

1

我可以看到你的代碼2個語法錯誤:

  1. 分隔符的命令應該是觸發定義之外,內部沒有它。 Phpmyadmin應該照顧這一點。

  2. begin ... end塊內的命令應以分號(;)結尾,而不是由您在分隔符命令中提供的任何內容結束。

我沒有檢查,如果觸發器中的SQL命令是有意義的,但是set命令的WHERE條件看起來不正確。

+0

是的你的權利。 1.分隔符應該在外面,但看起來像PHPmyAdmin觸發生成器有一些限制,更多的是單語句觸發器。我通過在xxx.sql文件中寫入更正並使用PHPmyAdmin中的導入來解決問題。稍後我會發布正確的內容。可能會幫助那些在PHPmyAdmin中也觸發了觸發器頁面的人。 – Olivers

+0

如果myanswer幫助您解決問題,請將其標記爲已接受,以便此主題的未來觀看者知道問題已解決。 – Shadow

1

好的,找到一個工作:
在文件中寫入完整的創建觸發器語句並使用PHPmyAdmin導入。

正如'影子'指出的那樣,在哪裏也有問題。
低於在我的方案中工作的更正的觸發器。
在網絡上有很多例子可以用mysql客戶端來完成觸發器。通過這種方式,您可以使用您輸入到客戶端的確切語法,並且在您無法使用命令外殼程序客戶端訪問服務器的情況下導入到PHPmyAdmin中。
希望這有助於其他新手。
乾杯,奧利弗

-- after_insert trigger for InvoiceItem to Calculate the Total in Invoice 
------------------------------------------------------------------------ 
DELIMITER // 
    CREATE TRIGGER `InvoiceItem_After_Insert` AFTER INSERT ON `invoiceItem` 
FOR EACH ROW 
BEGIN 
    SET @InvoiceNumber = NEW.InvoiceFK; 
    SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber); 
    UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber; 
END 
// 
DELIMITER ; 

-- after_update trigger for InvoiceItem to Calculate the Total in Invoice 
------------------------------------------------------------------------ 
DELIMITER // 
    CREATE TRIGGER `InvoiceItem_After_Update` AFTER UPDATE ON `invoiceitem` 
FOR EACH ROW 
BEGIN 
    SET @InvoiceNumber = NEW.InvoiceFK; 
    SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber); 
    UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber; 
END 
// 
DELIMITER ; 

-- after_delete trigger for InvoiceItem to Calculate the Total in Invoice 
---------------------------------------------------------------------- 
DELIMITER // 
    CREATE TRIGGER `InvoiceItem_After_Delete` AFTER DELETE ON `invoiceItem` 
FOR EACH ROW 
BEGIN 
    SET @InvoiceNumber = OLD.InvoiceFK; 
    SET @ItemTotal = (SELECT SUM(Extended) FROM InvoiceItem WHERE InvoiceFk = @InvoiceNumber); 
    UPDATE Invoice SET Total = @ItemTotal WHERE id = @InvoiceNumber; 
END 
// 
DELIMITER ; 
----------------------------------------------------------------- 

接下來的2個觸發器只是單獨的語句,並計算「擴展」列在表InvoceItem

--------------------------------------------------------------------- 
-- Calculate new 'Extended' price before insert 
CREATE TRIGGER `InvoiceItem_Before_Insert` BEFORE INSERT ON `invoiceitem` 
SET NEW.Extended = ROUND(NEW.Quantity * NEW.Price,2) 
------------------------------------------------------------------- 
-- Calculate new 'Extended' price before update 
CREATE TRIGGER `InvoiceItem_Before_Update` BEFORE UPDATE ON `InvoiceItem` 
FOR EACH ROW 
SET NEW.Extended = ROUND(NEW.Quantity * NEW.Price,2); 
相關問題