SQL Server - ограничение самоссылки - PullRequest
0 голосов
/ 10 февраля 2011

Использование 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?

1 Ответ

0 голосов
/ 10 февраля 2011

Прежде всего, я думаю, что после 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.

В любом случае, вам все еще нравится ваш дизайн?

...