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 と等しくなります

私の問題は、通貨データをテーブルに取り込むことです。挿入時に、どのように CurrencyID 列に stockID の ID 値を入力しますか?

4

1 に答える 1

0

まず、CurrencyId(おそらくint) の後に型指定子が必要だと思います。

質問を続けますが、そのような設計を主張する場合は、トリガーを使用して自己参照行を挿入できると思います。CurrencyIdNULLのみを許可する必要があります。つまり、定義しない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を持たないほうがいいです。

とにかく、あなたはまだあなたのデザインが好きですか?

于 2011-02-10T14:31:14.793 に答える