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

Utwórz relację w SQL

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 na NULL 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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie prostej aplikacji internetowej za pomocą funkcji Bottle, SQLAlchemy i Twitter API

  2. Błędy, pułapki i najlepsze praktyki T-SQL – funkcje okien

  3. Denormalizacja:kiedy, dlaczego i jak

  4. KNIME

  5. Używanie sterowników Easysoft ODBC z Informatica PowerCenter