SQL Server - ограничение самоссылки

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

Прежде всего, я думаю, что должен быть спецификатор типа после 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, но только после вставки, через последующее ОБНОВЛЕНИЕ. Но я бы предпочел не иметь NULL.

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

Другие вопросы по тегам