2015-01-13 5 views
1

я с удивлением обнаружил, что я могу создать внешний ключ, ссылающийся на первичный ключ, определенной на точно такую ​​же таблицу и столбец, например:FK реферирование ПК с той же колонке

ALTER TABLE dbo.Foo WITH CHECK ADD CONSTRAINT FK_Foo_Foo FOREIGN KEY(FooId) 
REFERENCES dbo.Foo (FooId) 

У меня есть клиент DB с таким FK, который определен и кажется полностью избыточным.

Он подходит для любых целей?

NB. Это не ситуация иерархического отношения - поле FK не является другим полем в той же таблице, что и родительский идентификатор, а скорее полем PK.

+0

Хорошим примером использования будет дизайн родительского/детского стиля. – gvee

+0

Я не думаю, что это применимо, см. Мое редактирование. –

+2

Я не вижу никакой возможной цели, которая могла бы служить, за исключением, возможно, предотвращения исключений. Я даже не знаю, что произойдет, если вы попытаетесь удалить строку из этой таблицы. –

ответ

1

Внешний ключ, который ссылается сам по себе, является циркулярной ссылкой или бесконечно рекурсивным отношением.

Ограничение никогда не будет нарушено, поскольку строка всегда соответствует самому себе.

Я полагаю, что это либо ошибка в дизайне, либо временный маркер для будущего развития, за которым никогда не следовало.

Это полностью избыточная функция, которую можно либо удалить, либо просто оставить в покое. Одна вещь, о которой я буду знать, это то, что Microsoft может запретить саморегуляцию FK в более поздней версии SQL Server. По этой причине я был бы склонен удалить ограничение, если будущая совместимость будет рассматриваться.

Для работы иерархии родитель-ребенок, внешний ключ должен ссылаться на другой столбец.

Смежные вопросы