【问题标题】:Check constraint between two tables检查两个表之间的约束
【发布时间】:2016-11-23 11:21:44
【问题描述】:

我有两张表,我们称它们为 A 和 B。它们具有一对多的关系。

表 A

Trxid int,
TotalAmount decimal(10,2)

表 B

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

表 B 包含表 A 的分解详细信息。

我的要求: 表 B 的 Amount 列的总和应等于表 A 的每个 trxidTotalAmount 列。

是否有任何限制可以实现这一点或有其他方法吗?

【问题讨论】:

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

标签: sql sql-server constraints


【解决方案1】:

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

  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 应该负责其余的工作。

【讨论】:

  • 第 3 点符合我的要求。感谢您的宝贵建议。
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2011-04-09
  • 1970-01-01
  • 2020-06-29
  • 2010-11-27
  • 2018-08-04
相关资源
最近更新 更多