我有三张桌子:
订单:
orderid, valuedid, valuesdesc
客户:
customerid, cutomdesc
组:
groupid, groupdesc
valueid
- 客户或群组的ID
valuesdesc
- 必须填写适用于valueid
或Customers
的插入Groups
说明,具体取决于在客户端中选择的用户(客户或群组)。
因此,当客户端发送Orders
的插入查询时,它包含orderid
新订单和valuedid
。在客户端,我知道用户选择了什么:组或客户。
我需要的是:如果Orders
中插入了新行,则valuesdesc
列中插入的客户或群组的valuedid
对应valuesdesc
。
我有一个想法是插入新订单记录valuesdesc
,其中包含键 - 假值以选择正确的词典(客户或群组),但是如何创建该触发器我很遗憾现在还不知道
答案 0 :(得分:2)
首先,我必须说这是一个非常罕见的设计。当您将记录插入Orders
时,可以使用valuesdesc
来提示valueid
引用的表。但是只要valuesdesc
被触发器填满,valueid
就会失去任何意义。也就是说,您没有透露任何其他方式来引用Customers
对Groups
的引用。所以,您也可以完全删除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加入Customers
和Groups
,然后使用Orders.valuesdesc
或customdesc
填充groupdesc
,具体取决于哪个不是{{1}}空。