如何更新产品表

时间:2014-02-04 20:07:01

标签: sql postgresql cartesian-product

我有三个表:表1(A,B),表2(C,D)和表3(A,B,C,D)。 表3包含表1和表2的笛卡尔积。

我需要创建必要的触发器,以便每当我插入,更新或删除Table1或Table2中的任何行时,Table3都会相应更新,以便它仍然是Table1和Table2的笛卡尔积。

我找不到合理的方法来做这件事,我很感激任何意见。 我正在使用PostgreSQL。

编辑:这是过去的考试,因此替代解决方案(例如将Table3制作成视图)无效。

3 个答案:

答案 0 :(得分:0)

为什么不把它作为观点?

CREATE VIEW Table3 AS SELECT A, B, C, D FROM Table1, Table2;

这样它会自动保持同步。

答案 1 :(得分:0)

我建议在当前的postgres版本中使用常规视图,在基表更新后,物化视图当前需要完全重新加载。可能未来的版本将支持增量更新,但完全重新加载不是一个非常有用的功能,因为它与SELECT中的INSERT一样简单。 可以使用触发器实现增量的物化视图,但我认为这也不是一个好主意,因为它会非常复杂(您必须维护特殊的表来存储更改日志)

答案 2 :(得分:0)

你需要理清语法,但逻辑并不太可怕:

  • 在INSERT到Table1(新值new_Anew_B)时,在触发器的主体中需要这样的INSERT:

    INSERT INTO Table3 SELECT new_A, new_B, Table2.C, Table2.D FROM Table2 
    
  • 对称地,在INSERT到Table2(新值new_Cnew_D)时,您需要在触发器主体中使用这样的INSERT:

    INSERT INTO Table3 SELECT Table1.A, Table1.B, new_C, new_D FROM Table1
    
  • 在Table1中删除DELETE(旧值old_Aold_B),在触发器的主体中需要这样的DELETE:

    DELETE FROM Table3 WHERE Table3.A = old_A AND Table3.B = old_B
    
  • 对称地,在Table2的DELETE(旧值old_Cold_D)上,你需要在触发器的主体中使用这样的DELETE:

    DELETE FROM Table3 WHERE Table3.C = old_C AND Table3.D = old_D
    
  • 在UPDATE上,您可以跟踪旧值和新值,然后执行DELETE,然后执行上面的INSERT组合。您可以通过查看Table1中的更新是更改了列A还是列B或两者来“优化”,但它可能不值得付出努力。

我把它拿回来;逻辑是可怕的。它并不是特别复杂,但保持这样的Table3的想法应该让你的皮肤爬行。

相关问题