Database
 sql >> Baza danych >  >> RDS >> Database

OGRANICZENIE KLUCZA OBCEGO SQL:Kompletny, łatwy przewodnik dla początkujących

Nowicjusz? Wtedy klucz obcy SQL może być dla Ciebie obcy.

Być może słyszałeś różne opinie na temat kluczy obcych SQL. Jeśli nie, wkrótce to zrobisz. Albo twoje doświadczenie wpłynie na twój widok. Najważniejsze, aby wiedzieć, że klucze obce są niezbędne w relacyjnych bazach danych.

Jednak niektórzy programiści mogą usuwać lub ignorować klucze obce w obliczu pewnych komplikacji. Więc co robić? Używać klucza obcego czy go nie używać? Czy będą chwile, kiedy nie będziesz musiał ich używać?

W tym przewodniku zobaczysz, jak ważna jest ta rzecz. Poznasz także kilka błędów w kodzie i dowiesz się, jak je naprawić. Poza tym oczywiście posłużymy się praktycznymi przykładami. Nie ma nic, z czym nie możesz sobie poradzić.

Co to jest klucz obcy SQL?

Najpierw najważniejsze. Co to jest klucz obcy w SQL? W kilku słowach jest to klucz, który łączy 2 stoły. Załóżmy, że masz tabelę nadrzędną i tabelę podrzędną. Istnieje pewna wspólność, która sprawia, że ​​są rodzicem i dzieckiem – kluczem, który łączy te dwie tabele.

Jednak w bazach danych SQL klucz obcy odnosi się nie tylko do tabel. Wymusza związek. Dlatego nazywa się to ograniczeniem klucza obcego.

Jeśli spróbujesz dodać rekord podrzędny z wartością klucza obcego, która nie istnieje w kluczach podstawowych tabeli nadrzędnej, wystąpi błąd. Później zobaczymy przykłady kodu ilustrujące to.

Które tabele powinny mieć ograniczenia klucza obcego SQL?

Tabele podrzędne mogą mieć klucze obce. Jeden klucz obcy może odwoływać się do innej tabeli. Ponadto w tabeli „podrzędnej” może znajdować się kilka kluczy obcych. W SQL Server klucz obcy może odwoływać się do klucza podstawowego lub unikalnego klucza w innej tabeli.

A co z odniesieniem do siebie?

Wychodzi to z ogólnej definicji klucza obcego. odniesienie do siebie oznacza, że ​​możesz przypisać klucz obcy, który odwołuje się inna kolumna w tej samej tabeli . Obsługują to SQL Server, MySQL i Oracle.

Odwoływanie się do siebie ma zastosowanie, gdy chcesz tworzyć hierarchie, takie jak relacja kierownik-pracownik. Jest to dozwolone, jednak większość implementacji kluczy obcych znajduje się między 2 tabelami.

Później przedstawimy przykłady.

4 korzyści z używania kluczy obcych SQL

Przyjrzyjmy się szczegółowo kluczowi podstawowemu i kluczowi obcemu w SQL. Co sprawia, że ​​klucze obce są niezbędne w bazie danych SQL? Przyjrzyjmy się 4 punktom (tutaj składnia ograniczeń nie ma znaczenia).

1. Unikaj „brakujących” danych

„Brakujące” dane to wartości kluczy obcych z tabel podrzędnych bez powiązanych wartości kluczy podstawowych z tabeli nadrzędnej. Są one również określane jako osierocone rzędy. Kiedy tak się dzieje, możemy powiedzieć, że baza danych ma niewielką lub żadną integralność referencyjną.

Gdy wymuszane są ograniczenia klucza obcego, „brakujące” dane w ogóle się nie pojawią. Aparat bazy danych nie pozwoli na usunięcie wartości klucza podstawowego, do której odwołuje się inna tabela. Podobnie, wstawienie klucza obcego do tabeli podrzędnej, który nie istnieje w kluczach podstawowych tabeli nadrzędnej, wywoła błąd.

Jaka jest najgorsza rzecz, która może się zdarzyć, jeśli nie użyjesz ograniczeń klucza obcego? Oto kilka:

  • Klienci nie otrzymają produktów, za które zapłacili.
  • Leczenie nie jest stosowane u pacjentów.
  • Brakujące listy kontrolne pomijają środki ostrożności.

Możesz obsłużyć te rzeczy poza bazą danych, ale musisz to zakodować. Więcej na ten temat wkrótce.

Załóżmy, że programista w Twojej organizacji obsługiwał to samo ograniczenie poza bazą danych. Czy będzie odpowiedzialny i naprawi problem w produkcji, jeśli kod się nie powiedzie? Nie sądzę. A jeśli jesteś administratorem bazy danych? Wtedy będziesz musiał posprzątać ich bałagan. Nie tak zachęcające, jeśli mnie o to pytasz.

2. Unikaj niespójnych raportów

Odnosi się do pierwszego punktu. Jeśli niektórych danych brakuje, w różnych raportach pojawiają się niespójne sumy. Szczegóły nie pasują do podsumowań. Osierocone wiersze sumują się do sum podsumowań. Tymczasem szczegółowy raport nie przechwycił osieroconych wierszy z powodu wewnętrznego sprzężenia z tabelami nadrzędnymi.

Jeśli Twoim zadaniem jest utrzymywanie bazy danych w dobrym stanie, posprzątasz również ten bałagan.

3. Nie jest potrzebny kod, aby uniknąć osieroconych wierszy

Ograniczenia klucza obcego działają jak środki samooczyszczające. Zamiast sprzątać bałagan, baza danych robi to, nie zezwalając na osierocone wiersze. Ograniczenia klucza obcego działają również jak policja. Aresztują błędną logikę, która powoduje osierocone wiersze, traktując to jak przestępstwo popełnione poza bazą danych.

Czy chcesz mieć błyszczącą bazę danych bez osieroconych wierszy? Oczywiście, że tak. Jeśli chcesz kiedyś przeanalizować dane, będziesz zadowolony, że użyłeś kluczy obcych. Ta baza danych będzie dobrym źródłem do kopiowania niezbędnych danych do obszaru postoju.

4. Szybko zrozum relacje między tabelami na diagramie

SQL Server Management Studio ma wbudowane narzędzie do tworzenia diagramów dla Twojej bazy danych. Klucze podstawowe i obce sprawiają, że diagram bazy danych zawiera informacje na pierwszy rzut oka. Będzie to jednak zależało od tego, ile tabel z relacjami uwzględniłeś na diagramie.

Diagramy pomagają nowym członkom zespołu zrozumieć strukturę danych. Dla starszych członków zespołu może być również przydatna jako dokumentacja.

Kiedy klucz obcy SQL może być „problemem” (plus poprawka)

Aby przenieść stare dane do nowej bazy danych, wstawiasz rekordy zbiorczo. Jeśli źródłowa baza danych ma niską integralność referencyjną, wstawianie rekordów ze źródła będzie trudne. Powodem jest to, że błędy kluczy obcych pojawiają się tu i tam.

Czy istnieje poprawka? Masz 2 opcje.

  1. Upewnij się, że najpierw wypełniłeś tabele referencyjne lub tabele nadrzędne. Następnie wypełnij tabele podrzędne. Jedna komplikacja działa bardzo wolno. W innych przypadkach występuje więcej błędów ograniczeń klucza obcego. Jeśli ma miejsce ten drugi przypadek, musisz ponownie ocenić kolejność wkładek i upewnić się, że klucze podstawowe są wstawiane jako pierwsze. Jeśli występuje problem „wolno działającego”, rozważ następną opcję.
  2. Tymczasowo wyłącz klucze obce i włącz je po zakończeniu migracji (i oczyszczeniu). Możesz to zrobić w SQL Server Management Studio lub skorzystać z T-SQL ALTER TABLE. Jednak łatwiej powiedzieć niż zrobić. W tym momencie oprócz sprytu i siły woli potrzebujesz więcej cierpliwości. Później znajdziemy składnię do wyłączania i ponownego włączania kluczy obcych.

Kolejną rzeczą do rozważenia jest użycie bazy danych jako obszaru pomostowego dla OLAP lub analizy danych. Załóżmy, że źródłowa transakcyjna baza danych jest wolna od osieroconych wierszy. Lub możesz uniknąć tych wierszy za pomocą kodu. Następnie możesz zrezygnować z używania kluczy obcych. Klucze obce spowalniają masowe wstawianie i aktualizacje, zwłaszcza w ogromnych zestawach danych.

3 proste sposoby dodawania, edytowania i usuwania ograniczeń kluczy obcych SQL

Co jest potrzebne do dodawania, edytowania lub usuwania kluczy obcych? Dzięki tym trzem wskazówkom jest to łatwe.

Pierwsze dwa kroki wykorzystują graficzny interfejs użytkownika. Narzędzia takie jak SQL Server Management Studio lub dbForge Studio dla SQL Server są bardzo dobrymi kandydatami. Trzecia użyje kodu T-SQL. Wybór kodu GUI lub T-SQL zależy od sytuacji.

1. Używanie projektanta tabel do dodawania, edytowania i usuwania ograniczenia klucza obcego SQL

W SQL możliwe jest dodanie ograniczeń klucza obcego podczas tworzenia lub zmiany struktury tabeli za pomocą Table Designer w SSMS. Rysunek 1 poniżej pokazuje, jak uzyskać do niego dostęp z głównego menu, gdy struktura tabeli jest otwarta.

Inną opcją jest kliknięcie prawym przyciskiem myszy w dowolnym miejscu projektanta tabeli i wybranie Relacje z menu kontekstowego:

Po wybraniu Związków , Kluczowe relacje z zagranicą pojawi się okno:

W Związkach z kluczami zagranicznymi w oknie, możesz dodać nowy klucz obcy lub edytować/usunąć istniejący.

Jeśli zdecydujesz się dodać lub edytować, kliknij, aby rozwinąć Tabele i kolumny Specyfikacje. Następnie kliknij wielokropek przycisk, aby zdefiniować lub edytować tabele kluczy podstawowych i obcych.

Stamtąd możesz wskazać kolumny klucza głównego i obcego.

Po zdefiniowaniu klucza podstawowego i obcego kliknij OK . Następnie wróć do projektanta tabel i zapisz zmiany.

2. Używanie diagramu bazy danych do dodawania, edytowania i usuwania ograniczenia klucza obcego SQL

Za pomocą diagramu bazy danych można utworzyć ograniczenia klucza obcego SQL. Rysunek 5 pokazuje, jak utworzyć relację między dwiema tabelami, klikając tabelę kluczy obcych i przeciągając ją do tabeli kluczy podstawowych.

Po zwolnieniu myszy Tabele i kolumny pojawi się okno takie jak na rysunku 4. Następnie możesz wskazać kolumny klucza podstawowego i obcego. Następnie kliknij OK.

Aby edytować istniejącą relację, kliknij prawym przyciskiem myszy relację na diagramie. Następnie wybierz Właściwości :

Następnie w Właściwościach rozwiń Tabele i kolumny i kliknij wielokropek przycisk:

Po kliknięciu wielokropka przycisk Tabele i kolumny pojawi się okno. Możesz zmienić kolumny klucza głównego i obcego (sprawdź ponownie Rysunek 4 powyżej).

Tymczasem usuwanie związku wymaga kliknięcia prawym przyciskiem istniejącego relacja. Wybierz Usuń relacje z bazy danych i kliknij Tak po wyświetleniu monitu.

3. Używanie T-SQL do dodawania, edytowania i usuwania ograniczenia klucza obcego SQL

Trzecim sposobem dodania klucza obcego jest użycie kodu T-SQL. Możesz użyć SQL CREATE TABLE i dodać ograniczenie klucza obcego. Możesz też użyć ALTER TABLE, aby dodać to ograniczenie po utworzeniu tabeli.

Oto składnia używania CREATE TABLE:

-- Single-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NULL REFERENCES Table1(col1)
)
GO

Po zdefiniowaniu nazwy i typu kolumny można dodać REFERENCJE do tabeli i kolumny. Powyższa składnia pokazuje Tabelę1 tabela na col1 kolumna. Pamiętaj, że nazwy kolumn w obu tabelach muszą być takie same, aby były prawidłowe dla kluczy obcych.

Powyższa składnia dotyczy jednokolumnowych kluczy obcych. Jeśli potrzebujesz wielu kolumn jako kluczy obcych, użyj klauzuli FOREIGN KEY, jak poniżej:

-- Multiple-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NOT NULL,
 col2 INT NOT NULL,
 col3 VARCHAR(10) NULL
 CONSTRAINT FK_Table1_Table2 FOREIGN KEY(col1, col2)
	REFERENCES Table1(col1,col2)
)
GO

Po utworzeniu tabeli możesz dodać klucze obce za pomocą ALTER TABLE. Oto składnia:

ALTER TABLE Table2 WITH CHECK ADD CONSTRAINT FK_Table1_Table2_2 FOREIGN KEY(col3)
	REFERENCES Table3(col1)
GO

Aby usunąć ograniczenie klucza obcego, możesz użyć ALTER TABLE z DROP CONSTRAINT:

ALTER TABLE Table2 
DROP CONSTRAINT FK_Table1_Table2_2
GO

Teraz możemy podsumować 3 sposoby dodawania, edytowania i usuwania kluczy obcych:

Przykłady ograniczeń klucza obcego SQL (MySQL)

Tabela podrzędna ma 1 odniesienie do tabeli nadrzędnej

-- Single Reference
CREATE TABLE [dbo].[Countries](
	[CountryID] [int] IDENTITY(1,1) NOT NULL,
	[Country] [nvarchar](50) NOT NULL,
	[ContinentID] [int] NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
	[CountryID] ASC
))
GO

ALTER TABLE [dbo].[Countries]  WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID])

GO

ALTER TABLE [dbo].[Countries] CHECK CONSTRAINT [FK_Countries_Continent]
GO

Aby zobrazować tę zależność, spójrz na rysunek 9 poniżej:

Identyfikator Kontynentu jest kluczem, który łączy ze sobą te dwie tabele.

Tabela podrzędna z wieloma odniesieniami

SportsCar tabela ma wiele odniesień do trzech różnych tabel:

-- Multiple References
CREATE TABLE [dbo].[SportsCars](
	[SportsCarID] [int] IDENTITY(1,1) NOT NULL,
	[ManufacturerID] [int] NULL,
	[StyleID] [int] NULL,
	[CountryID] [int] NULL,
	[Model] [nvarchar](50) NOT NULL,
	[Years] [varchar](50) NOT NULL,
	[Notes] [varchar](255) NOT NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_SportsCars] PRIMARY KEY CLUSTERED 
(
	[SportsCarID] ASC
))
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Country] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Manufacturer] FOREIGN KEY([ManufacturerID])
REFERENCES [dbo].[Manufacturers] ([ManufacturerID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Manufacturer]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Styles] FOREIGN KEY([StyleID])
REFERENCES [dbo].[Styles] ([StyleID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Styles]
GO

Oto jak to wygląda na diagramie bazy danych:

Odniesienie do siebie

Hierarchie pozycji pokazują samoodniesienie w poniższej tabeli:

CREATE TABLE [dbo].[Ranks](
	[RankId] [int] IDENTITY(1,1) NOT NULL,
	[Rank] [varchar](50) NOT NULL,
	[RankLevel] [smallint] NOT NULL,
	[RankParentId] [int] NULL,
 CONSTRAINT [PK_Ranks] PRIMARY KEY CLUSTERED 
(
	[RankId] ASC
)) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Ranks] WITH CHECK ADD CONSTRAINT [FK_Ranks_Ranks] FOREIGN KEY([RankParentId])
REFERENCES [dbo].[Ranks] ([RankId])
GO

ALTER TABLE [dbo].[Ranks] CHECK CONSTRAINT [FK_Ranks_Ranks]
GO

Schemat tego samoodniesienia jest prosty. Linia wskazuje na tę samą tabelę w samoodniesieniu.

Z AKTUALIZACJĄ i USUWANIEM

W przypadku opcji ON UPDATE CASCADE zaktualizowanie wartości kolumny klucza podstawowego spowoduje również zaktualizowanie wartości klucza obcego w powiązanych tabelach. Tymczasem, gdy używasz ON DELETE CASCADE, usunięcie klucza podstawowego spowoduje również usunięcie kluczy obcych. Domyślnym ustawieniem PRZY ZAKTUALIZOWANIU i PRZY USUNIĘCIU jest BRAK DZIAŁANIA.

Oto przykład UPDATE i DELETE CASCADE:

ALTER TABLE [dbo].[Countries] WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE
GO

Wyłączanie ograniczenia klucza obcego SQL

Następujące czynności wyłączą istniejące ograniczenie klucza obcego. Zauważ, że związek nadal istnieje.

ALTER TABLE [dbo].[SportsCars] NOCHECK CONSTRAINT [FK_SportsCars_Country]
GO

Nie jest to ustawienie domyślne i nie jest zalecane. Aby jednak przyspieszyć zbiorcze wstawianie i aktualizacje, możesz tymczasowo wyłączyć klucz obcy, taki jak ten powyżej. Po zakończeniu musisz zmienić je z powrotem za pomocą opcji SPRAWDŹ OGRANICZENIE.

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

Gotcha i poprawki

W tej sekcji dowiesz się, co się dzieje, gdy wstawiasz, aktualizujesz lub usuwasz rekordy z kluczami obcymi. Zakłada się również, że klucze obce nie są wyłączone z OGRANICZENIEM NOCHECK. Pomoże ci to, gdy napotkasz te typowe problemy.

Przy INSERT

-- This will cause an error because countryID = 47 does not exist in the Countries table
INSERT INTO SportsCars 
(ManufacturerID, StyleID, CountryID, Model, Years, Notes) 
VALUES (108, 10, 47, 'F2', '2021', 'Limited Edition')
GO

Oto komunikat o błędzie:

Msg 547, Level 16, State 0, Line 56 The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'. The statement has been terminated.

Poprawka :Dodaj Identyfikator kraju =47 do Krajów pierwszy stół. Następnie ponownie uruchom powyższą instrukcję INSERT. Sekwencja zaczyna się od wstawienia rekordów do tabeli nadrzędnej, a następnie do tabeli podrzędnej.

W dniu AKTUALIZACJI

-- Update CountryID to 47 will trigger an error.
UPDATE SportsCars
SET CountryID = 47
WHERE ManufacturerID = 108
GO

Oto błąd UPDATE:

Msg 547, Level 16, State 0, Line 60 The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'. The statement has been terminated.

Poprawka :Dodaj Identyfikator kraju =47 do Krajów stół. Następnie ponownie uruchom instrukcję UPDATE.

Po usunięciu

-- This will trigger an error because ManufacturerID = 108 is referenced in the SportsCars table
DELETE FROM Manufacturers
WHERE ManufacturerID = 108

Ten kod wywoła błąd, jak poniżej:

Msg 547, Level 16, State 0, Line 64 The DELETE statement conflicted with the REFERENCE constraint "FK_SportsCars_Manufacturer". The conflict occurred in database "Vehicles", table "dbo.SportsCars", column 'ManufacturerID'. The statement has been terminated.

Poprawka :usuń odpowiednie rekordy z SportsCars tabela z IDProducenta =108. Następnie ponownie uruchom powyższą instrukcję DELETE. Innym sposobem jest włączenie opcji ON DELETE CASCADE, jeśli ma to zastosowanie. Sekwencja zaczyna się od usunięcia rekordów z tabel podrzędnych, a następnie – z tabeli nadrzędnej.

Na wynos

Czy klucze obce nadal są Ci obce?

Zróbmy podsumowanie tego, czego się do tej pory nauczyliśmy.

  • Klucze obce łączą dwie tabele (lub jedną tabelę w przypadku korzystania z samoodniesienia). Potrzebujesz ich, aby zapewnić integralność referencyjną.
  • Możesz użyć narzędzia GUI lub T-SQL, aby dodać, edytować lub usunąć ograniczenia klucza obcego.
  • W przypadku narzędzi z graficznym interfejsem użytkownika można użyć programu SQL Server Management Studio lub dbForge Studio dla programu SQL Server. Oba oferują diagramy baz danych i projektantów tabel do tworzenia tabel z kluczami podstawowymi i obcymi.
  • CREATE TABLE i ALTER TABLE są odpowiednie do dodawania i usuwania ograniczeń klucza obcego.
  • Możesz tymczasowo wyłączyć klucze obce za pomocą NOCHECK CONSTRAINT w ALTER TABLE. Przyspieszy to masowe wstawianie i aktualizacje. Ale upewnij się, że włączyłeś go ponownie za pomocą SPRAWDŹ OGRANICZENIE.
  • Aby uniknąć problemów z kluczami obcymi, postępuj zgodnie z właściwą sekwencją. W przypadku INSERT i UPDATE wstawiaj najpierw do tabeli nadrzędnej, a następnie do tabel podrzędnych. W przypadku opcji DELETE najpierw usuń rekordy podrzędne, a następnie rekordy nadrzędne.

Czy chciałbyś dodać coś, co pomoże nowicjuszom opanować klucze obce? Komentarze sekcja jest otwarta na Twoje błyskotliwe pomysły. Jeśli podoba Ci się ten post, udostępnij go na swoich ulubionych platformach społecznościowych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak obliczyć wiek od daty urodzenia w SQL

  2. Jak działa indeksowanie?

  3. Jak zainstalować Microsoft SQL w systemie Linux

  4. Hash Joins w kolumnach z możliwością wartości null

  5. Potencjalne ulepszenia ASPState