检查两个表之间的约束

问题描述:

我有两个表,我们称它们为A和B.它们有一对多的关系。检查两个表之间的约束

表A

Trxid int, 
TotalAmount decimal(10,2) 

表B

Trxid int, 
TblBcol Varchar, 
Amount decimal(10,2) 

表B包含表A.

我要求分手细节:和表格的Amount列B应该等于表A的每个trxidTotalAmount列。

是否有任何约束条件可以实现这一目标,或者是否有其他方法?

+3

一种选择是将表A替换为视图。 –

+0

其他选项可以在'TableB'上创建一个触发器,用于插入或更新'TableA'中的相应行。但@ destination-data建议的想法更合适。 – Ubercool

+0

@ destination-data感谢您的回应。表A还包含其他列。将它们移到表B将导致冗余。 – user7199624

有几种可能的解决方案。根据您的喜好选择。

  1. 摆脱冗余。在两个表中必须匹配的数量列可能不是必需的。只有一个数量的列可能就足够了,因此永远不需要让他们“同步”。你在这两个表之间有一个外键关系,所以你的数据库客户端总是可以使用JOIN来将查询的数量列从一个表中“附加”到另一个表中。

  2. B中删除Amount并创建一个视图。如果您的客户端需要包含在当前的B表中的同一信息的表,但他们只查询该表,你可以用视图替换为:

    CREATE VIEW B WITH SCHEMABINDING AS 
    SELECT BWithoutAmount.Trxid, BWithoutAmount.TblBcol, A.TotalAmount AS Amount 
    FROM BWithoutAmount JOIN A ON BWithoutAmount.Trxid = A.Trxid; 
    

    这假定有一个基本表BWithoutAmount取代您当前的B,但没有Amount列。 B视图代替当前的B基表。

  3. 在表格AB上定义TRIGGER他们的任务是更新B中的Amount列,以便它与A中相应行的金额相匹配。触发器需要在以下情况下运行:

    • 当更新A中的一行时。
    • 插入B中的一行时。

    FK约束和ON DELETE CASCADE应该照顾其余的。

+0

第3点将符合我的要求。感谢您的宝贵建议。 – user7199624