Просматривая базу данных, я наткнулся на таблицу, в которой ее первичный ключ использовался как внешний ключ.
Я видел, что таблица может иметь внешний ключ для построения иерархической структуры, но она будет использовать другой столбец для ссылки на первичный ключ.
Поскольку первичный ключ уникален, в этой ситуации строка не сможет указывать только на себя? Кажется, это тавтологическая связь, так как если у меня уже есть строка, то у меня уже есть строка.
Есть ли причина, по которой это будет сделано?
Я уверен, что ограничение написано именно так (а не только на диаграмме), потому что одна и та же таблица и столбец используются для обеих половин определения.
sql-server
foreign-key
primary-key
Aaroninus
источник
источник
Ответы:
Как ты сказал.
FOREIGN KEY
Ограничение ссылок на ту же таблицу , как правило , для иерархической структуры , и было бы использовать еще один столбец для ссылки на первичный ключ. Хорошим примером является таблица сотрудников:Так что в этом случае внешний ключ от таблицы возвращается к себе. Все менеджеры также являются сотрудниками, так что на
ManagerId
самом делеEmployeeId
это менеджер.С другой стороны, если вы имеете в виду, что кто-то использовал
EmployeeId
внешний ключ в таблице Employee, то это, вероятно, ошибка . Я выполнил тест, и это возможно, но он не будет иметь никакого реального использования.источник
Я только что нашел такой внешний ключ в своей собственной базе данных, и, должно быть, он сам создавал его. Я думаю, что это произошло случайно. Если я нажимаю «Новый внешний ключ» в контекстном меню таблицы с первичным ключом (в среде Management Studio, SQL 2014 Express), это уже автоматически создает такой внешний ключ, ссылающийся на себя. Увидеть ниже:
Если я тогда не пойму, что мне следует изменить это вместо того, чтобы добавить новое, оно останется там. Или, если я просто нажму кнопку [Закрыть], означающую, что это будет похоже на [Отмена], внешний ключ все равно будет создан после сохранения определения таблицы.
Так что для меня такой внешний ключ не имеет смысла и может быть удален.
источник
Возможно, дизайнер хотел отключить использование
TRUNCATE TABLE
?TRUNCATE TABLE
не может использоваться в таблице с ограничением внешнего ключа для другой таблицы, хотя его можно использовать, если существуют внешние ссылки, ссылающиеся на себя. Из документации для TRUNCATE TABLE (Transact-SQL) :DELETE
Заявление безWHERE
оговорки имеет подобный эффект кTRUNCATE TABLE
(удаление всех строк в таблице) , ноDELETE
оператор запускает УДАЛИТЬ триггеры, которые могут быть причиной , чтобы позволить ,DELETE
но неTRUNCATE TABLE
.Я бы сделал это с помощью разрешений (
DELETE
требуется разрешение на удаление,TRUNCATE TABLE
требуется разрешение на изменение таблицы), но, может быть, по какой-то причине дизайнер не смог этого сделать?Примечание: хотя то, что сделал дизайнер, на самом деле не запрещает его использование
TRUNCATE TABLE
, я все еще предполагаю, что это было их намерением.источник