Sql 检查两个表之间的约束
我有两张桌子,我们叫它们A和B。它们有一对多的关系 表ASql 检查两个表之间的约束,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
Trxid int,
TotalAmount decimal(10,2)
表B
Trxid int,
TblBcol Varchar,
Amount decimal(10,2)
表B包含表A的细分明细
我的要求:对于每个trxid
,表B的金额
列的总和应等于表A的总金额
列
是否有任何约束条件可以实现这一点,或者是否有其他方法?有几种可能的解决方案。根据你的喜好选择
连接它们,以便将金额列从一个表“附加”到另一个表以进行查询
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
应处理其余部分
一个选项是用视图替换表A。另一个选项可能是在
TableB
上创建触发器,该触发器插入或更新TableA
中的相应行。但是@destination data建议的想法更合适。@destination data感谢您的回复。表A还包含其他列。将它们移动到表B将导致冗余。@Pramod谢谢。但表B的每一行插入都会根据总金额进行检查,结果验证失败。我有点不清楚-a.TotalAmount是单独填写的还是必须始终是B.amount的总和?如果单独填写,且仅用于检查文档有效性,则在B中插入行时,不应检查失败-否则,除非包含全部金额,否则无法插入任何内容。之后您必须验证整个文档,而不是SQL任务(但可以使用SQL过程)。第3点将符合我的要求。谢谢你的宝贵建议。