Dowiedz się, jak utworzyć relację między dwiema tabelami w SQL Server.
W projekcie relacyjnej bazy danych powiązanie to miejsce, w którym co najmniej dwie tabele są połączone ze sobą, ponieważ zawierają powiązane dane. Umożliwia to użytkownikom uruchamianie zapytań o powiązane dane w wielu tabelach.
Ta część samouczka wyjaśnia, jak utworzyć następujące relacje:
Na tym diagramie są dwie zależności. Istnieje związek między Albums
i Artists
tabele i istnieje inny związek między Albums
i Genres
tabele.
Patrząc na ten diagram, widzimy, że jeden artysta mógł mieć wiele albumów. W tym przypadku wystarczy nam jeden wiersz zawierający nazwisko artysty, niezależnie od tego, ile ma albumów. Dzieje się tak, ponieważ możemy utworzyć rekord w Artists
tabela z unikalnym ArtistId
. Wszystkie albumy tego wykonawcy będą znajdować się w Albums
tabeli i będą zawierać ten sam identyfikator wykonawcy we własnym ArtistId
kolumna. W ten sposób możemy uruchomić zapytanie w obu tabelach i zwrócić nazwę wykonawcy oraz wszystkie wydane przez niego albumy. To jest korzyść z relacji.
Wcześniej stworzyliśmy bazę danych zawierającą powyższe trzy tabele. Kiedy to zrobiliśmy, stworzyliśmy również jedną z relacji przedstawionych na powyższym diagramie. Stworzyliśmy relację między Albums
tabeli i Artists
tabela (gdzie ArtistId
kolumna Albums
tabela odwołuje się do ArtistsId
kolumna Artists
tabeli).
Oto kod, który uruchomiliśmy, aby utworzyć tabele:
Podświetlony kod to część, która tworzy relację między Albums
tabeli i Artists
stół. Robi to poprzez ustawienie ArtistId
kolumna Albums
by odwołać się do ArtistId
kolumna Artists
tabela.
Bardziej technicznym sposobem powiedzenia tego jest to, że Albums.ArtistId
staje się kluczem obcym Artists.ArtistId
(który sam w sobie jest kluczem podstawowym tej tabeli). To jest ograniczenie klucza obcego.
Co to jest ograniczenie klucza obcego?
ograniczenie klucza obcego definiuje relację między tą tabelą a inną tabelą. Kiedy tworzysz ograniczenie klucza obcego, tworzysz je względem określonej kolumny w dziecko tabeli, aby odwoływać się do określonej kolumny w rodzicu tabela.
To sprawia, że ta kolumna w tabeli podrzędnej jest kluczem obcym . Ograniczenie zapewnia, że każda wartość, która trafia do tej kolumny (klucza obcego), odpowiada wartości w kolumnie klucza podstawowego tabeli nadrzędnej. Jeśli ktoś spróbuje wprowadzić wartość, która nie odpowiada wartości w kolumnie klucza podstawowego tabeli nadrzędnej, SQL Server zgłosi błąd.
Pomaga to wymusić integralność referencyjną. Uniemożliwia nam to osierocone rekordy (rekordy podrzędne, które nie mają rodzica). Lub w naszym przykładzie albumy, które nie są powiązane z żadnym wykonawcą.
Jeśli używasz narzędzia GUI do zarządzania bazą danych, takiego jak SSMS lub Azure Data Studio, relacja pojawi się pod Keys
węzeł dla tabeli z kluczem obcym:
Zdekonstruujmy kod:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
Pierwsze dwie linie tworzą relację. Tworzą ograniczenie klucza obcego między
Albums.ArtistId
kolumna i
Artists.ArtistId
kolumna. W tym przypadku wywołujemy ograniczenie klucza obcego FK_Albums_Artists
.
Ostatnie dwa wiersze określają, co powinien zrobić program SQL Server, jeśli ktoś próbuje usunąć lub zaktualizować rekord nadrzędny, do którego odwołuje się rekord w tabeli podrzędnej. W takim przypadku NO ACTION
oznacza, że usuwanie/aktualizacja nie będzie kontynuowana. Użytkownik po prostu otrzyma błąd.
Możesz to zmienić na ON DELETE CASCADE
jeśli chcesz mieć możliwość usunięcia rodzica i dziecka za jednym razem (tj. usunięcie będzie kaskadowe od rodzica do dziecka). Ta sama logika dotyczy aktualizacji, używając ON UPDATE CASADE
.
NO ACTION
jest wartością domyślną, więc mogliśmy obejść się bez tych dwóch ostatnich wierszy kodu. Jednak uwzględniłem to, ponieważ jest to ważny czynnik, o którym należy pomyśleć podczas tworzenia ograniczeń kluczy obcych.
Dodaj relację do istniejącej tabeli
Poprzedni przykład tworzy relację w tym samym czasie, w którym tworzone są tabele. Może się jednak zdarzyć, że trzeba będzie dodać relację do istniejącej tabeli.
Dodajmy nową relację między Genres
i Albums
tabele.
Uruchom następujący kod:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
Tworzy to nowy klucz obcy w Albums
stół. Powoduje to Albums.GenreId
staje się kluczem obcym, który odwołuje się do Genres.GenreId
.
Tak więc uruchomienie tej instrukcji spowoduje wyświetlenie nowego klucza obcego pod Kluczami węzeł:
Klucze obce jednokolumnowe
Klucze obce jednokolumnowe (takie jak ten powyżej) można również określić na poziomie kolumny. Więc inny sposób tworzenia Albums
tabela i jej klucz obcy wygląda tak:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
Ta metoda nie może być używana na ograniczeniach wielokolumnowych, więc w tym przypadku użyj składni z oryginalnego przykładu powyżej.
Wielokolumnowe klucze obce
W wielokolumnowym kluczu obcym dla klucza obcego używana jest więcej niż jedna kolumna. Jest to zwykle używane, gdy tabela nadrzędna używa wielu kolumn jako klucza podstawowego. Może tak być, jeśli tabela nadrzędna łączy wartości z dwóch kolumn, aby utworzyć unikalną wartość.
Wielokolumnowe klucze obce można tworzyć przy użyciu składni z oryginalnego przykładu powyżej. Po prostu dodaj każdą nazwę kolumny oddzieloną przecinkiem.
Jeśli więc wyobrazimy sobie, że Albums
tabela ma również ArtistName
kolumna (i że Artists
tabela używa ArtistId
i ArtistName
jako klucz podstawowy), wielokolumnowy klucz obcy wyglądałby tak:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)