【问题标题】:Postgresql Create Trigger Before Deleting A RowPostgresql 在删除行之前创建触发器
【发布时间】:2016-11-11 03:27:34
【问题描述】:

所以我有这两个表:

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


 -- Table addlisting
 columns: id, user_fk,price,date_added

这是我的问题:我想创建一个触发器,以便当我从 addlisting 表中删除列表时,列表的价格会添加到表 user 中的“earnedmoney”列中。

有人可以帮我吗?谢谢!

【问题讨论】:

    标签: postgresql triggers plpgsql stored-functions


    【解决方案1】:
    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 触发器,这没什么区别。

    【讨论】:

    • 谢谢,你太棒了!
    • @mazunki 没有;请提出一个包含完整信息的新问题。
    【解决方案2】:

    只需创建常规 BEFORE DELETE 触发器:

    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)
    

    【讨论】:

    • 说的很详细,我很感激。顺便说一句,coalesce() 函数有什么作用?
    • 如果第一个参数为空,那么它将返回第二个。 coalesce(arg1, arg2) = case when arg1 is null then arg2 else arg1 end
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2017-06-26
    • 2021-02-01
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多