Increment/decrement table 中的计数值取决于另一个 table 的特定列值的 insert/delete 使用 postgresql 中的触发器

Increment/decrement count value in a table depending on insert/delete of a specific column value of another table using triggers in postgresql

Tables

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

employee table 中插入或删除时,根据 dno 值,必须在 dcount 中执行 increment/decrement department table.

目标 是在插入和删除员工 table.

时自动计算部门中的员工人数

我尝试使用函数 increments/decrements 使用 if 和 elsif 进行操作 'INSERT' 和 'DELETE' 的值,但所做的只是将 dcount 中的所有值递增 1。

它不 increase/decrease 特定部门 dcount 值对应于从员工 table 中插入或删除的 dno 值。

需要一些帮助和指导。

谢谢。

格鲁希斯

tables 用于测试

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);

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

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