我有三个表:表1(A,B),表2(C,D)和表3(A,B,C,D)。 表3包含表1和表2的笛卡尔积。
我需要创建必要的触发器,以便每当我插入,更新或删除Table1或Table2中的任何行时,Table3都会相应更新,以便它仍然是Table1和Table2的笛卡尔积。
我找不到合理的方法来做这件事,我很感激任何意见。 我正在使用PostgreSQL。
编辑:这是过去的考试,因此替代解决方案(例如将Table3制作成视图)无效。
答案 0 :(得分:0)
为什么不把它作为观点?
CREATE VIEW Table3 AS SELECT A, B, C, D FROM Table1, Table2;
这样它会自动保持同步。
答案 1 :(得分:0)
我建议在当前的postgres版本中使用常规视图,在基表更新后,物化视图当前需要完全重新加载。可能未来的版本将支持增量更新,但完全重新加载不是一个非常有用的功能,因为它与SELECT中的INSERT一样简单。 可以使用触发器实现增量的物化视图,但我认为这也不是一个好主意,因为它会非常复杂(您必须维护特殊的表来存储更改日志)
答案 2 :(得分:0)
你需要理清语法,但逻辑并不太可怕:
在INSERT到Table1(新值new_A
,new_B
)时,在触发器的主体中需要这样的INSERT:
INSERT INTO Table3 SELECT new_A, new_B, Table2.C, Table2.D FROM Table2
对称地,在INSERT到Table2(新值new_C
,new_D
)时,您需要在触发器主体中使用这样的INSERT:
INSERT INTO Table3 SELECT Table1.A, Table1.B, new_C, new_D FROM Table1
在Table1中删除DELETE(旧值old_A
,old_B
),在触发器的主体中需要这样的DELETE:
DELETE FROM Table3 WHERE Table3.A = old_A AND Table3.B = old_B
对称地,在Table2的DELETE(旧值old_C
,old_D
)上,你需要在触发器的主体中使用这样的DELETE:
DELETE FROM Table3 WHERE Table3.C = old_C AND Table3.D = old_D
在UPDATE上,您可以跟踪旧值和新值,然后执行DELETE,然后执行上面的INSERT组合。您可以通过查看Table1中的更新是更改了列A还是列B或两者来“优化”,但它可能不值得付出努力。
我把它拿回来;逻辑是可怕的。它并不是特别复杂,但保持这样的Table3的想法应该让你的皮肤爬行。