2011-02-12 103 views
0

我有三個表:需要幫助寫一個觸發

訂單: orderid, valuedid, valuesdesc

客戶: customerid, cutomdesc

組: groupid, groupdesc

valueid - 顧客的ID或組

valuesdesc - 必須填寫適合插入的valueid來自CustomersGroups的說明取決於在客戶端中選擇了哪些(客戶或組)用戶。

因此,當客戶端發送Orders的插入查詢時,它包含新訂單的orderidvaluedid。而在客戶端,我知道用戶選擇了什麼:組或客戶。

我需要什麼:如果一個新行插入Orders,相應valuesdescvaluedid從插入valuesdesc列客戶或組。

我有一個想法,插入新的訂單記錄valuesdesc其中包含關鍵假貨價值來挑選正確的詞典(客戶或團體),但如何創建我現在不知道的觸發器。

回答

2

首先,我必須說這是一個非常不尋常的設計。當您將記錄插入Orders時,可以使用valuesdesc來提示valueid引用的表格。但只要valuesdesc被觸發器填滿,valueid實質上就失去了意義。也就是說,您沒有透露我們您有任何其他方式可以參考Groups來參考Customers。因此,您可以完全刪除valueid,並使用valuesdesc傳遞該表中的'詞典'提示和參考。

除此之外,因爲valueid可以引用多個表,所以不能對其使用foreign key約束。

不管怎樣,在你現在的設計,你可以試試這個:

CREATE TRIGGER Orders_UpdateValuesdesc 
ON Orders 
FOR INSERT 
AS 
UPDATE o 
SET valuesdesc = COALESCE(c.customdesc, g.groupdesc) 
FROM Orders o 
    INNER JOIN inserted ON o.orderid = i.orderid 
    LEFT JOIN Customers c ON i.valuesdesc = 'Customers' 
    AND i.valueid = c.customerid 
    LEFT JOIN Groups g ON i.valuesdesc = 'Groups' 
    AND i.valueid = g.customerid 

'Customers''Groups'意味着作爲字典符的字符串。用實際值替換它們。

觸發器使用LEFT JOIN加入既CustomersGroups,然後填充Orders.valuesdesc與任一customdescgroupdesc,這取決於哪一個不爲空。

+0

謝謝你的例子。 Andriy,因爲我已經理解你解釋valueid在獲得valuedesc後是多餘的,因爲它失去了參考和關鍵含義?它推動了我正確的想法。我會盡力。 – johnny 2011-02-12 19:54:04