2016-07-08 3 views
0

을 삭제하기 전에 트리거를 만들어 내가 테이블 addlisting에서 목록을 삭제하면되도록 트리거를 작성하고 싶습니다 가격 목록의 "earnedmoney"열에 추가됩니다.PostgreSQL을 그래서 난이 두 테이블이 행입니다

누군가 나를 도울 수 있습니까? 고맙습니다!

답변

2
CREATE OR REPLACE FUNCTION add_money() RETURNS trigger AS 
$$BEGIN 
    UPDATE "user" SET earnedmoney = earnedmoney + OLD.price 
     WHERE id = OLD.user_fk; 
    RETURN OLD; 
END;$$ LANGUAGE plpgsql; 

CREATE TRIGGER add_money 
    BEFORE DELETE ON addlisting FOR EACH ROW 
    EXECUTE PROCEDURE add_money(); 

은 또한 어떤 차이가없는 것 인 AFTER 트리거 될 수 있습니다.

+0

감사합니다, 당신은 최고입니다! – Nano

1

그냥 삭제하기 전에 트리거를 정기적으로 만들 :

test1=# create table addlisting (id serial PRIMARY KEY, user_fk integer, price float, date_entered date); 
CREATE TABLE 

test1=# insert into users (name, sername, password, token) values ('user1', '', '123', '123'), ('user2', '', '234', '234'); 
INSERT 0 2 

test1=# insert into addlisting (user_fk, price, date_entered) values (1, 100, now()), (1, 34, now()), (2, 465, now()); 
INSERT 0 3 

test1=# select * from users; 
id | name | sername | password | token | earnedmoney 
----+-------+---------+----------+-------+------------- 
    1 | user1 |   | 123  | 123 |    
    2 | user2 |   | 234  | 234 |    
(2 rows) 

test1=# select * from addlisting; 
id | user_fk | price | date_entered 
----+---------+-------+-------------- 
    1 |  1 | 100 | 2016-07-08 
    2 |  1 | 34 | 2016-07-08 
    3 |  2 | 465 | 2016-07-08 
(3 rows) 

test1=# CREATE OR REPLACE FUNCTION update_price() RETURNS trigger AS $emp_stamp$ 
test1$#  BEGIN 
test1$#   update users 
test1$#   set earnedmoney = coalesce(earnedmoney, 0) + coalesce(OLD.price, 0) 
test1$#   where id = OLD.user_fk; 
test1$# 
test1$#   return OLD; 
test1$#  END; 
test1$# $emp_stamp$ LANGUAGE plpgsql; 
CREATE FUNCTION 

test1=# CREATE TRIGGER on_delete_addlisting 
test1-# BEFORE DELETE ON addlisting 
test1-#  FOR EACH ROW EXECUTE PROCEDURE update_price(); 
CREATE TRIGGER 

테스트 :

test1=# delete from addlisting where id in (1,3);      
DELETE 2 

test1=# select * from addlisting; 

id | user_fk | price | date_entered 
----+---------+-------+-------------- 
    2 |  1 | 34 | 2016-07-08 
(1 row) 

test1=# select *from users;    
id | name | sername | password | token | earnedmoney 
----+-------+---------+----------+-------+------------- 
    1 | user1 |   | 123  | 123 |   100 
    2 | user2 |   | 234  | 234 |   465 
(2 rows) 


test1=# delete from addlisting; 
DELETE 1 

test1=# select *from users; 
id | name | sername | password | token | earnedmoney 
----+-------+---------+----------+-------+------------- 
    2 | user2 |   | 234  | 234 |   465 
    1 | user1 |   | 123  | 123 |   134 
(2 rows) 
+0

그것은 매우 상세합니다. 나는 그것을 고맙게 생각합니다. Btw, coalesce() 함수는 무엇을합니까? – Nano

+0

첫 번째 인수가 null이면 두 번째를 반환합니다. '''coalesce (arg1, arg2) = arg1이 널이면 arg2, 그렇지 않으면 arg1이 끝날 때''' –