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.
В любом случае, вам все еще нравится ваш дизайн?