2013-07-26 51 views
2

我已經創建了一些表用於開票。觸發器維持總計

有一個invoice_header和invoice_detail表。該發票明細包含在發票明細,invoice_header_id,數量,UNIT_PRICE,TAX_AMOUNT等

發票頭已經帳單地址,發票沒有,invoice_total等

我已經創建了一個插入/更新觸發/刪除,使頭中的invoice_total是總和(invoice_details.qty * invoice_details.unit_price)

有一種情況我不知道如何照顧。 如果我更新invoice_detail行,將其與不同的標題關聯。 這樣

UPDATE invoice_details SET invoice_header_id=1 WHERE invoice_header_id=2 

的觸發條件會,但它會更新舊的頭記錄,但總不是新的。我該如何迎合這種情況?

+0

在黑暗中拍攝,但您的觸發器創建的樣子是什麼樣子?也許你需要'AFTER'插入/更新而不是'BEFORE'? –

+1

只是一個想法:我會創建一個查看您的詳細信息,即時計算頭。這樣它總是正確的。你正在反規格化數據,這通常會導致這樣的麻煩。只有當性能是一個真正的問題時,你應該考慮你的設計。 – Bohemian

+0

@波希米亞,我沒有真正考慮視圖作爲一種選擇,我可以放棄這一點。乾杯 – bumperbox

回答

1

這不適合你嗎?

Mysql trigger syntax

在觸發器主體,OLD和NEW關鍵字,使您能夠訪問受觸發行 列。 OLD和NEW是對觸發器的擴展;他們不區分大小寫。

在INSERT觸發器中,只能使用NEW.col_name;沒有舊的 行。在DELETE觸發器中,只能使用OLD.col_name;沒有 新的行。在UPDATE觸發器中,可以使用OLD.col_name在更新之前引用行的列,並且NEW.col_name引用 更新後的行的列。

以OLD命名的列是隻讀的。你可以參考它(如果你有 SELECT權限),但不能修改它。如果您具有SELECT權限,您可以參考用NEW命名的 列。在之前的觸發器中,如果您具有UPDATE特權,您也可以使用SET NEW.col_name = value 更改其值。這意味着您可以使用 觸發器來修改要插入到新行中的值或用於更新行的 。 (這樣一組語句在觸發 後無影響,因爲該行的變化已經發生了。)

那麼,你就必須OLD.invoice_header_id(2)和NEW.invoice_header_id(1)內部觸發爲您更新invoice_header

CREATE TRIGGER check BEFORE UPDATE ON invoice_detail 
FOR EACH ROW 
BEGIN 
    IF NEW.invoice_header_id <> OLD.invoice_header_id THEN 
     You Do the math and update both invoice_header lines 
    END IF; 
END