Sql 检查两个表之间的约束

Sql 检查两个表之间的约束,sql,sql-server,constraints,Sql,Sql Server,Constraints,我有两张桌子,我们叫它们A和B。它们有一对多的关系 表A Trxid int, TotalAmount decimal(10,2) 表B Trxid int, TblBcol Varchar, Amount decimal(10,2) 表B包含表A的细分明细 我的要求:对于每个trxid,表B的金额列的总和应等于表A的总金额列 是否有任何约束条件可以实现这一点,或者是否有其他方法?有几种可能的解决方案。根据你的喜好选择 消除冗余。可能没有必要在两个表中都有必须匹配的金额列。只有一个amoun

我有两张桌子,我们叫它们A和B。它们有一对多的关系

表A

Trxid int,
TotalAmount decimal(10,2)
表B

Trxid int,
TblBcol Varchar,
Amount decimal(10,2)
表B包含表A的细分明细

我的要求:对于每个
trxid
,表B的
金额
列的总和应等于表A的
总金额


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

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

  • 消除冗余。可能没有必要在两个表中都有必须匹配的金额列。只有一个amount列可能就足够了,因此根本不需要保持它们“同步”。这两个表之间存在外键关系,因此数据库客户端可以始终
    连接它们,以便将金额列从一个表“附加”到另一个表以进行查询

  • 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;
    
    这假设存在一个不带金额的基表
    B,该基表取代了当前的
    B
    ,但没有
    Amount
    列。
    B
    视图取代当前的
    B
    基表

  • 在表
    a
    B
    上定义
    触发器
    ,它们的任务是更新
    B
    中的
    金额
    列,使其与
    a
    中相应行的金额相匹配。触发器需要在以下情况下运行:

    • 更新
      a
      中的行时
    • 插入
      B
      中的行时
    FK约束和DELETE CASCADE上的
    应处理其余部分


  • 一个选项是用视图替换表A。另一个选项可能是在
    TableB
    上创建触发器,该触发器插入或更新
    TableA
    中的相应行。但是@destination data建议的想法更合适。@destination data感谢您的回复。表A还包含其他列。将它们移动到表B将导致冗余。@Pramod谢谢。但表B的每一行插入都会根据总金额进行检查,结果验证失败。我有点不清楚-a.TotalAmount是单独填写的还是必须始终是B.amount的总和?如果单独填写,且仅用于检查文档有效性,则在B中插入行时,不应检查失败-否则,除非包含全部金额,否则无法插入任何内容。之后您必须验证整个文档,而不是SQL任务(但可以使用SQL过程)。第3点将符合我的要求。谢谢你的宝贵建议。