检查两个表之间的约束
问题描述:
我有两个表,我们称它们为A和B.它们有一对多的关系。检查两个表之间的约束
表A
Trxid int,
TotalAmount decimal(10,2)
表B
Trxid int,
TblBcol Varchar,
Amount decimal(10,2)
表B包含表A.
我要求分手细节:和表格的Amount
列B应该等于表A的每个trxid
的TotalAmount
列。
是否有任何约束条件可以实现这一目标,或者是否有其他方法?
答
有几种可能的解决方案。根据您的喜好选择。
摆脱冗余。在两个表中必须匹配的数量列可能不是必需的。只有一个数量的列可能就足够了,因此永远不需要让他们“同步”。你在这两个表之间有一个外键关系,所以你的数据库客户端总是可以使用
JOIN
来将查询的数量列从一个表中“附加”到另一个表中。-
从
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
基表。 -
在表格
A
和B
上定义TRIGGER
。他们的任务是更新B
中的Amount
列,以便它与A
中相应行的金额相匹配。触发器需要在以下情况下运行:- 当更新
A
中的一行时。 - 插入
B
中的一行时。
FK约束和
ON DELETE CASCADE
应该照顾其余的。 - 当更新
+0
第3点将符合我的要求。感谢您的宝贵建议。 – user7199624
一种选择是将表A替换为视图。 –
其他选项可以在'TableB'上创建一个触发器,用于插入或更新'TableA'中的相应行。但@ destination-data建议的想法更合适。 – Ubercool
@ destination-data感谢您的回应。表A还包含其他列。将它们移到表B将导致冗余。 – user7199624