如何制作更新不同表的计数器触发器?
Posted
技术标签:
【中文标题】如何制作更新不同表的计数器触发器?【英文标题】:How can I make a counter trigger that updates a different table? 【发布时间】:2021-05-07 17:55:48 【问题描述】:基本上我想要做的是创建一个触发器,它更新我插入新工人的城市中的工人数量,但到目前为止我不知道我该怎么做。
这是到目前为止的代码,但它不起作用,但我认为我的意思是有意义的。
Create or replace trigger Worker_insert
After insert
on worker
begin
update cities Set workers_count=workers_count+1
where cities.name=worker.city;
end;
【问题讨论】:
在worker.city
上没有加入您的别名worker
我强烈建议 NOT 这样做。灾难等待发生。只需在表上执行 select count(*) 或在执行此操作的城市表上创建视图。
【参考方案1】:
您几乎肯定不想这样做。对数据进行非规范化几乎没有意义。将总数存储在您使用触发器维护的单独表中可能会随着时间的推移让您感到非常痛苦。出于某种原因,当您在cities
上创建未来触发器时,它会让您在未来面临变异表错误,正确处理每一种可能的情况是很痛苦的(您需要处理删除工作人员或例如,更新工人所在的城市)。当它是一个不太可能被频繁查询并且不太可能需要特别准确的统计数据时尤其如此,因此非规范化的潜在好处是最小的。如果您想要实时结果或每晚刷新的物化视图(如果您对近似结果感到满意),创建一个为您执行计算的视图几乎总是更有意义。
但是,如果你真的想去规范化,你会做这样的事情(你需要处理明显的 delete
和 update
情况)
Create or replace trigger Worker_insert
After insert
on worker
for each row
begin
update cities
Set workers_count = nvl(workers_count,0)+1
where cities.name=:new.city;
end;
【讨论】:
【参考方案2】:您不想为此触发;你想使用VIEW
:
CREATE VIEW city_workers ( city_name, workers_count ) AS
SELECT c.name,
COUNT(w.id)
FROM cities c
LEFT OUTER JOIN worker w
ON ( c.name = w.city )
GROUP BY c.name
db小提琴here
【讨论】:
以上是关于如何制作更新不同表的计数器触发器?的主要内容,如果未能解决你的问题,请参考以下文章
表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值
我正在使用 BLOC 制作一个简单的计数器应用程序,但是当我增加/减少计数器时,我的计数器没有更新?我使用 BlocBuilder 构建 UI