0

使用 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 列?

4

1 回答 1

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(或CurrencyId用 NULL 更新),这意味着你希望该行引用自己(至少这是触发器认为你想要的),否则你指定正确的参考值CurrencyId和触发器绕过这些行。

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

不管怎样,你还喜欢你的设计吗?

于 2011-02-10T14:31:14.793 回答