Przeglądając bazę danych, natknąłem się na tabelę, która używała swojego klucza podstawowego jako klucza obcego dla siebie.
Widziałem, że tabela może mieć dla siebie klucz obcy, aby zbudować strukturę hierarchiczną, ale użyłaby innej kolumny do odwołania się do klucza podstawowego.
Ponieważ klucz podstawowy jest unikalny, w tej sytuacji wiersz nie byłby w stanie skierować się tylko do siebie? To wydaje się być linkiem tautologicznym, ponieważ jeśli już mam wiersz, to już go mam.
Czy jest jakiś powód, aby to zrobić?
Jestem pewien, że ograniczenie jest zapisane w ten sposób (nie tylko patrząc na diagram), ponieważ ta sama tabela i kolumna są używane dla obu połówek definicji.
sql-server
foreign-key
primary-key
Aaroninus
źródło
źródło
Odpowiedzi:
Tak jak powiedziałeś.
FOREIGN KEY
Ograniczenie przedstawieniu tej samej tabeli jest typowo dla struktury hierarchii i byłoby użyć innej kolumny odwołać klucz podstawowy. Dobrym przykładem jest tabela pracowników:Tak więc w tym przypadku klucz obcy pochodzi z tabeli z powrotem do siebie. Wszyscy menedżerowie są również pracownikami, więc tak
ManagerId
naprawdę należyEmployeeId
do kierownika.Z drugiej strony, jeśli masz na myśli, że ktoś użył tego
EmployeeId
klucza obcego do tabeli pracownika, to prawdopodobnie był to błąd . Przeprowadziłem test i jest to możliwe, ale nie przydałoby się to w rzeczywistości.źródło
Właśnie znalazłem taki klucz obcy w moim własnym pliku db i musiałem go sam tworzyć. Myślę, że to się stało przez przypadek. Jeśli kliknę „Nowy klucz obcy” w menu kontekstowym tabeli z kluczem podstawowym (w Management Studio, SQL 2014 Express), to już automatycznie tworzy taki klucz obcy odnoszący się do siebie. Patrz poniżej:
Jeśli wtedy nie zdam sobie sprawy, że powinienem to zmienić, zamiast dodawać nowe, pozostanie tam. Lub, jeśli po prostu kliknę przycisk [Zamknij], co oznacza, że byłoby to jak [Anuluj], klucz obcy nadal byłby tworzony po zapisaniu definicji tabeli.
Dla mnie taki klucz obcy nie ma sensu i można go usunąć.
źródło
Być może projektant chciał wyłączyć korzystanie z
TRUNCATE TABLE
?TRUNCATE TABLE
nie można go używać w tabeli z ograniczeniem klucza obcego do innej tabeli, chociaż można go użyć, jeśli istnieją klucze referencyjne obce. Z dokumentacji TRUNCATE TABLE (Transact-SQL) :DELETE
Oświadczenie bezWHERE
klauzuli ma podobny wpływ na ATRUNCATE TABLE
(usuwanie wszystkich wierszy w tabeli), aleDELETE
twierdzenie pożary Usuwanie wyzwalaczy, co może być powodem, aby umożliwićDELETE
ale nieTRUNCATE TABLE
.Zrobiłbym to przy użyciu uprawnień (
DELETE
wymaga uprawnień do usuwania,TRUNCATE TABLE
wymaga uprawnień do zmiany tabeli), ale może istnieje jakiś powód, dla którego projektant nie mógł tego zrobić?Uwaga: Chociaż to, co zrobił projektant, tak naprawdę nie wyłącza korzystania
TRUNCATE TABLE
, nadal spekuluję, że taki był ich zamiar.źródło