表中的递增/递减计数值取决于使用 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
上面的屏幕截图显示了两个表employee
和department
,其中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 中的触发器插入/删除另一个表的特定列值的主要内容,如果未能解决你的问题,请参考以下文章