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