W SQL tworzysz relację, tworząc ograniczenie klucza obcego.
Dokładniej, masz tabelę nadrzędną i tabelę podrzędną. Rodzic zawiera klucz podstawowy, a tabela podrzędna zawiera klucz obcy, który odwołuje się do klucza podstawowego tabeli nadrzędnej.
Gdy do tworzenia relacji używasz języka SQL, możesz utworzyć relację w czasie tworzenia tabeli lub później (zmieniając tabelę). Ten artykuł obejmuje oba scenariusze.
Utwórz relację podczas tworzenia tabeli
Oto przykład tworzenia relacji w ramach CREATE TABLE
oświadczenie w momencie tworzenia tabeli.
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Tutaj stworzyłem dwa stoły; jeden o nazwie Parent
i drugi o nazwie Child
.
Stworzyłem relację w ramach definicji tabeli dla dziecka. Relacja jest tworzona za pomocą CONSTRAINT
argument. Zauważ, że nadal znajduje się w CREATE TABLE
oświadczenie.
Związek potrzebuje nazwy. W tym przypadku nazwałem go FK_Child_Parent
. FOREIGN KEY
po części następuje nazwa kolumny (w tabeli podrzędnej), która będzie kluczem obcym.
REFERENCES
część określa kolumnę, do której będzie się odwoływać klucz obcy. W tym przypadku odwołuje się do ParentId
kolumna Parent
stół. Odbywa się to za pomocą REFERENCES Parent (ParentId)
.
To wszystko, co jest potrzebne do stworzenia relacji.
Zwróć uwagę, że przykłady na tej stronie zostały wykonane przy użyciu programu SQL Server. W zależności od systemu DBMS może być konieczna zmiana niektórych szczegółów definicji kolumn.
Na przykład IDENTITY
to wersja SQL Server tego, co jest czasami nazywane AUTO_INCREMENT
w innych DBMS (takich jak MySQL). Jeśli używasz SQLite, oto jak utworzyć automatycznie zwiększającą się kolumnę w SQLite.
Dodaj relację do istniejącej tabeli
Możesz również dodać relację do istniejącej tabeli, po prostu używając ALTER TABLE
oświadczenie.
Załóżmy, że nie stworzyliśmy relacji podczas tworzenia dwóch tabel z poprzedniego przykładu. Załóżmy więc, że zamiast tego zrobiliśmy to:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
W tym scenariuszu wszystko, co zrobiliśmy, to utworzenie dwóch tabel. Nie powstała między nimi żadna relacja.
Teraz, po utworzeniu tabel, nagle przypominamy sobie „o cholera, zapomniałem stworzyć związek!”.
Nie ma problemu, teraz możemy to zrobić:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Zrobione. Właśnie dodaliśmy relację, używając tych samych szczegółów, co w poprzednim przykładzie.
Zwróć uwagę, że SQLite nie obsługuje dodawania kluczy obcych za pomocą ALTER TABLE
oświadczenie. Zobacz, jak dodać klucz obcy do istniejącej tabeli w SQLite, aby uzyskać więcej informacji.
Po aktualizacji/usunięciu
Domyślnie relacje serwera SQL Server są tworzone przy użyciu polecenia ON DELETE NO ACTION
i ON UPDATE NO ACTION
. Dlatego poprzednie przykłady zostały utworzone przy użyciu tego ustawienia.
Jednak różne DBMS mogą używać innych ustawień domyślnych.
Tak czy inaczej, możesz to wyraźnie określić w swoim kodzie. Możemy więc zmodyfikować poprzedni przykład, aby wyglądał tak:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
W rzeczywistości oznacza to, że gdyby ktoś próbował usunąć lub zaktualizować rekord w kluczu podstawowym, wystąpiłby błąd i zmiana zostałaby wycofana. Jest to sposób SQL Server na zapobieganie wszelkim zmianom, które mogą naruszyć referencyjną integralność systemu.
Zasadniczo powodem, dla którego tworzysz relację, jest przede wszystkim wymuszenie integralności referencyjnej.
Masz jednak kilka opcji, w jaki sposób chcesz, aby SQL Server radził sobie z takimi sytuacjami.
W szczególności możesz użyć dowolnej z następujących wartości:
NO ACTION
:Zgłaszany jest błąd i akcja usuwania/aktualizacji w wierszu w tabeli nadrzędnej jest wycofywana.CASCADE
:odpowiednie wiersze są usuwane z/aktualizowane w tabeli odniesienia, jeśli ten wiersz jest usuwany z/aktualizowany w tabeli nadrzędnej.SET NULL
:Wszystkie wartości tworzące klucz obcy są ustawione naNULL
jeśli odpowiedni wiersz w tabeli nadrzędnej zostanie usunięty lub zaktualizowany. Wymaga to, aby kolumny kluczy obcych miały wartość zerową.SET DEFAULT
:Wszystkie wartości tworzące klucz obcy są ustawiane na ich wartości domyślne, jeśli odpowiedni wiersz w tabeli nadrzędnej zostanie usunięty lub zaktualizowany. Aby to ograniczenie zostało wykonane, wszystkie kolumny kluczy obcych muszą mieć definicje domyślne. Jeśli kolumna dopuszcza wartość null i nie ma jawnie ustawionej wartości domyślnej,NULL
staje się niejawną wartością domyślną kolumny.