2017-06-14 17 views
0

我在PostgreSQL中有三個表:customers,services和purchased_services。它與鏈接表是一對多的關係,因此在第二個表中引用主鍵的第三個表中有外鍵。每個表中都有一個主鍵。在客戶表中,我有charge列,在服務中有tax_percents列,並且在買到的服務中有列quantitywithout_tax,taxtotal。我想寫一個觸發器,在quantity列更新之後會更新所有的without_tax等列以及客戶的charge列。我寫了這個至今:如何找出在postgresql中更新了哪一行

CREATE FUNCTION updateValues() RETURN TRIGGER AS 
$BODY$ 
BEGIN 
UPDATE bought_services SET 
     without_tax = quantity * (SELECT services.net_price FROM bought_services LEFT JOIN 
      services ON bought_serices.service_id = services.id), 
     tax = without_tax * (SELECT services.tax_percents FROM bought_services LEFT JOIN 
      services ON bought_serices.service_id = services.id) * 0.01, 
     total= without_tax + tax ; 

     UPDATE customers SET 
     charge = SELECT SUM(total) FROM bought_services LEFT JOIN customers ON 
      wykupione_uslugi.customer_id = customers.id WHERE bought_services.customer_id = ? 
    end; 
$BODY$ 

CREATE TRIGGER UpdateBoughtServicesValues AFTER UPDATE ON bought_services 
FOR EACH ROW EXECUTE PROCEDURE updateValues(); 

我真的不知道應該怎麼類型,而不是?也就是說,我應該怎麼告訴我要總結總額的所有客戶服務的Postgres對此我更新了其中一個的quantity字段。

+0

這不是Postgres的有效觸發器代碼。 –

+0

我試圖使用我的MySQL知識,所以你可以提供更多的細節? – Colonder

+0

更正的代碼,現在是否正確? – Colonder

回答

1

與MySQL不同Postgres有兩種不同類型的觸發器:一種針對每行(稱爲MySQL)和語句級觸發器進行調用。

在行級觸發器中,可以使用記錄new直接訪問更新(或插入)的行。

所以,據我所知,你的觸發器應該是這樣的:

CREATE FUNCTION updatevalues() RETURN TRIGGER AS 
$BODY$ 
declare 
    l_net_price decimal; 
    l_tax_percent decimal; 
BEGIN 

    SELECT services.net_price, service.tax_percents 
    into l_net_price, l_tax_percent 
    FROM services 
    where service_id = new.service_id; 

    new.without_tax := quantity * l_net_price; 
    new.tax := without_tax * l_tax_percent; 
    new.total := new.without_tax + new.tax; 

    UPDATE customers 
     SET charge = (select SUM(total) 
        FROM bought_services 
        where bought_services.customer_id = new.customer_id) 
    where id = new.customer_id; 
end; 
$BODY$; 

我優化了一點,只運行選擇該稅計算一次。


無關,但:這種計算在觸發器中通常不是一個好主意。設計關係數據庫的黃金經驗法則是不存儲可以從現有數據派生的數據。這種聚合只能在非常罕見的情況下完成。否則,只要我需要它們,我就可以將這些數字彙總起來我只會做這樣的事情,如果我絕對必須。請注意,Postgres通常比使用MySQL的查詢複雜得多(更快)。所以不要害怕加入很多桌子。只有當你看到這個真的給出了一個不可接受的表現,然後使用這樣的技巧。

+0

謝謝,我也認爲這種類型的計算很麻煩,但我仍然很好奇,並且想要嘗試寫這樣的觸發器。謝謝。 – Colonder

相關問題