我想創建連續更新價格的觸發器。但是,每當我添加金額時,這都可以正常作業,但是每當我洗掉專案或使用較小的值進行更新時,它就不起作用。我怎樣才能讓這個觸發器滿足所有 3 個需求?我不想撰寫多個觸發器來處理這個問題。
CREATE FUNCTION sum_total() RETURNS TRIGGER
AS $$
BEGIN
UPDATE payment
SET price = price (SELECT SUM(price) from basket WHERE service_id = new.service_id)
WHERE service_id = new.service_id;
RETURN NULL;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER sum_total AFTER INSERT ON basket
FOR EACH ROW EXECUTE PROCEDURE sum_total();
uj5u.com熱心網友回復:
Postgres 觸發器函式有一組特殊的區域變數可供它使用。其中之一,TG_OP指示導致觸發器觸發的動作。有了這個,multiple 的基本模板就變成了:
create function trigger_function_name()
returns trigger
language plpgsql
as $$
begin
case TG_OP
when 'INSERT' then
<place code for insert processing here>
when 'UPDATE' then
<place code for update processing here>
when 'DELETE' then
<place code for delete processing here>
when 'TRUNCATE' then
<place code for truncate processing here> -- note must be Statement level trigger
end ;
return new;
end ;
$$ ;
但是,我建議不要嘗試這樣做。快速保持運行總數變得復雜。這尤其是當您試圖維護的價值很容易交付時:
select sum(price) from basket where service_id = service_id_parameter;
這帶來了另一點。您的計算演算法payment存在根本性缺陷,無法按原樣運行。考慮一個用戶將一個商品以 10 的價格添加到他們的購物籃中。支付價格不會是 10(如果這是第一個商品會發生什么?該payment條目是否存在service_id?)現在用戶稍后添加說 20 的第二個專案。現在的總數現在basket是 30 (10 20),但值payment是 40 (10 sum(10,20))。另一個具有相同專案但以相反順序選擇它們的用戶會發生什么。(提示,你會得到不同的payment值。)
最佳流程:除非您期望數以百萬計的人完全消除觸發器并payment在需要時派生,也許有這樣做的觀點。
uj5u.com熱心網友回復:
您可以使用OR
以下檔案指定不同的事件型別:https :
//www.postgresql.org/docs/9.2/sql-createtrigger.html
event
One of INSERT, UPDATE, DELETE, or TRUNCATE; this specifies the
event that will fire the trigger.
Multiple events can be specified using OR.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380156.html
標籤:sql PostgreSQL的
