Postgresql 在Postgres中,当我更改计算派生列的原始数据时,有没有办法让派生列自动更新?

Postgresql 在Postgres中,当我更改计算派生列的原始数据时,有没有办法让派生列自动更新?,postgresql,Postgresql,假设我有两张桌子A和B。 A有两列: x | y __|__ 1 | 2 3 | 4 5 | 6 B有一列,是A中列的乘积: z _ 2 12 30 假设我将表A中的值4改为3,那么表B中的12应该改为9(3*3),但事实并非如此。如何使B在原始值更改时自动更新?这是一种适合a的东西: 然后从视图中选择结果。缺点是每次从视图中选择时都会运行此查询。还有一个选项,您可以在其中确定何时使用刷新物化视图更新值您首先不应该这样做。您应该只在数据库或表中保留原子数据。如果你真的需要它,我会创建一个触发

假设我有两张桌子A和B。 A有两列:

x | y
__|__
1 | 2
3 | 4
5 | 6
B有一列,是A中列的乘积:

z
_
2
12
30

假设我将表A中的值4改为3,那么表B中的12应该改为9(3*3),但事实并非如此。如何使B在原始值更改时自动更新?

这是一种适合a的东西:


然后从视图中选择结果。缺点是每次从视图中选择时都会运行此查询。还有一个选项,您可以在其中确定何时使用
刷新物化视图更新值

您首先不应该这样做。您应该只在数据库或表中保留原子数据。如果你真的需要它,我会创建一个触发器,根据值的变化更新必要的数据。我的实际设置与我描述的有点不同,一个表包含开始日期,一个表包含结束日期,第三个表包含成本。理想情况下,我会将结果((结束-开始)*成本)与结束日期放在同一个表中,但我不知道如何使用从不同表派生的列来实现这一点,因此我得到了一个新的结果表触发器是如何工作的?触发器可以出于以下目的编写− 自动生成一些派生列值;加强参照完整性;事件记录和存储有关表访问的信息;审计;表的同步复制;实施安全授权;防止无效事务。我认为这正是您所需要的。B应该是一个从a中选择的视图。虽然您想要做的事情也可能与触发器有关,但创建触发器并不是件小事。此外,如果A和B中的行实际上彼此不相关,例如使用外键,触发器将不起作用。即使您可以使用触发器处理此问题,我认为您的答案应该是正确的。
CREATE VIEW 
    results 
AS  
   SELECT a.x * a.y AS product