我有兩個表,我們稱它們爲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
列。
是否有任何約束條件可以實現這一目標,或者是否有其他方法?
我有兩個表,我們稱它們爲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
應該照顧其餘的。
第3點將符合我的要求。感謝您的寶貴建議。 – user7199624
一種選擇是將表A替換爲視圖。 –
其他選項可以在'TableB'上創建一個觸發器,用於插入或更新'TableA'中的相應行。但@ destination-data建議的想法更合適。 – Ubercool
@ destination-data感謝您的迴應。表A還包含其他列。將它們移到表B將導致冗餘。 – user7199624