2016-11-23 79 views
1

我有兩個表,我們稱它們爲A和B.它們有一對多的關係。檢查兩個表之間的約束

表A

Trxid int, 
TotalAmount decimal(10,2) 

表B

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

表B包含表A.

我要求分手細節:和表格的Amount列B應該等於表A的每個trxidTotalAmount列。

是否有任何約束條件可以實現這一目標,或者是否有其他方法?

+3

一種選擇是將表A替換爲視圖。 –

+0

其他選項可以在'TableB'上創建一個觸發器,用於插入或更新'TableA'中的相應行。但@ destination-data建議的想法更合適。 – Ubercool

+0

@ destination-data感謝您的迴應。表A還包含其他列。將它們移到表B將導致冗餘。 – user7199624

回答

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應該照顧其餘的。

+0

第3點將符合我的要求。感謝您的寶貴建議。 – user7199624