表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值

Posted

技术标签:

【中文标题】表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值【英文标题】:Increment/decrement count value in a table depending on insert/delete of a specific column value of another table using triggers in postgresql 【发布时间】:2021-12-26 00:22:31 【问题描述】:

Tables

上面的屏幕截图显示了两个表employeedepartment,其中employee 包含员工的详细信息,department 包含有关部门的信息。

employee 表中插入或删除时,根据dno 值,必须在department 表的dcount 中进行递增/递减。

目标是在员工表中插入和删除时自动计算部门中的员工数。

我尝试使用函数来增加/减少使用 if 和 elsif 操作“INSERT”和“DELETE”的值,但所做的只是将 dcount 中的所有值增加 1。

它不会增加/减少特定部门的dcount 值相对于从员工表中插入或删除dno 值。

需要一些帮助和指导。

谢谢。

格鲁希斯

【问题讨论】:

【参考方案1】:

测试表

create table employee (fname text, dno integer);
create table department (dname text, dnumber integer, dcount integer default 0);

insert into department (dname,dnumber) values ('Research',5),('Administration',4),('Headquarters',1);

我在部门表中创建了两个函数,分别是递增和递减计数器,然后将它们添加到删除和插入触发器中

CREATE or replace FUNCTION increment_c() RETURNS trigger AS $increment_c$
    BEGIN
        update department set dcount=dcount+1 where dnumber=NEW.dno;
        RETURN NULL;
    END;
$increment_c$ LANGUAGE plpgsql;

CREATE or replace FUNCTION decrement_c() RETURNS trigger AS $decrement_c$
    BEGIN
        update department set dcount=dcount-1 where dnumber=OLD.dno;
        RETURN NULL;
    END;
$decrement_c$ LANGUAGE plpgsql;

create TRIGGER tr_insert AFTER insert on employee for each row execute procedure increment_c();
create TRIGGER tr_delete AFTER delete on employee for each row execute procedure decrement_c();

测试和结果插入

insert into employee values ('James',1),('Jhon',5),('Frenklin',5);
INSERT 0 3
postgres=# select * from department;
     dname      | dnumber | dcount
----------------+---------+--------
 Administration |       4 |      0
 Headquarters   |       1 |      1
 Research       |       5 |      2

删除

delete from employee where fname='Jhon';
DELETE 1
postgres=# select * from department;
     dname      | dnumber | dcount
----------------+---------+--------
 Administration |       4 |      0
 Headquarters   |       1 |      1
 Research       |       5 |      1

【讨论】:

以上是关于表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值的主要内容,如果未能解决你的问题,请参考以下文章

如何配置STM32定时器在每次递增/递减时触发中断?

react-redux 中的奇怪按钮行为

链表习题-将两个递增单链表合并成一个递减单链表

shared_ptrs 是不是由于引用计数器原子递增/递减而遇到缓存未命中?

多个fa-heart像计数递增和递减

Objective-C中的引用计数