SQL Server - 自引用约束

时间:2011-02-10 12:53:07

标签: sql-server foreign-keys identity self-reference

使用SQL Server 2008

我有一张包含股票/股票/安全信息的表格。该表保存了可以拥有的股票。

每只股票都有与之相关的货币。问题是货币也是一种股票也可以拥有。即现金持有时

create table Stock
(
StockId int identity(1,1) not null CONSTRAINT StockPK PRIMARY KEY,
stockName varchar(100),
...
CurrencyId CONSTRAINT StockCurrencyIDFK FOREIGN KEY REFERENCES Stock(StockID),
)

对于现金行,CurrencyId将等于StockId

我的问题是将货币数据输入表格。在插入时,如何使用stockID的标识值填充CurrencyID列?

1 个答案:

答案 0 :(得分:0)

首先,我认为在CurrencyId之后必须有一个类型说明符(可能是int)。

继续你的问题,如果你坚持这样的设计,我认为插入自引用的行可以在触发器的帮助下完成。只有CurrencyId应该允许NULL,即将其定义为NOT NULL(你不在你的例子中,多么幸运)。这里有一个问题:应该允许NULL 技术,但不能逻辑,也就是说你必须总是有一个值,否则触发器会为你填充它。

顺便说一句,在我们讨论触发器时,这是一个可能的实现:

CREATE TRIGGER Stock_UpdateCurrencyId
ON Stock
FOR INSERT, UPDATE
AS
UPDATE Stock
SET CurrencyId = StockId
FROM inserted
WHERE Stock.StockId = inserted.StockId
  AND inserted.CurrencyId IS NULL

所以,这个想法基本上是这样的:如果你插入一个空CurrencyId的行(或用NULL更新CurrencyId),这意味着你想让行引用自己(至少那个是触发器会想到你想要什么),否则你为CurrencyId指定了正确的参考值,触发器会绕过这些行。

还记得当我说你不应该在你的逻辑设计中允许NULL吗?好吧,我这样说可能有点太仓促了。实际上,如果仅为INSERT定义触发器,您将能够存储NULL,但仅在插入之后,通过后续UPDATE。但我宁愿没有NULL。

无论如何,你还喜欢你的设计吗?