2016-07-08 5 views
0

так что я эти две таблицы:Postgresql Создание триггера Перед удалением строки

Table user 
columns: id,name,surname, password,token,earnedmoney 


Table addlisting 
columns: id, user_fk,price,date_added 

Вот моя проблема: Я хотел бы создать триггер, так что, когда я удалить список из таблицы addlisting, цена списка добавляется в столбец «earnedmoney», который находится в таблице пользователя.

Может ли кто-нибудь мне помочь? Спасибо!

ответ

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

Если первый аргумент равен нулю, он будет возвращать второй. '' 'coalesce (arg1, arg2) = случай, когда arg1 равен null, тогда arg2 else arg1 end''' –

 Смежные вопросы

  • Нет связанных вопросов^_^