piątek,
SQL: Klucz obcy
Klucz obcy w bazie danych to klucz używany do łączenia dwóch tabel. Jest to kolumna (lub zestaw kolumn) w jednej tabeli, która odpowiada kluczowi głównemu lub unikalnej kolumnie w innej tabeli. Klucz obcy tworzy relację między dwiema tabelami i jest ważnym elementem w projektowaniu relacyjnych baz danych.
Zaprojektowanie tabel z kluczami obcymi wymaga zrozumienia relacji między danymi. W przykładzie użyto uniwersalnego podejścia, które będzie kompatybilne z większością systemów zarządzania bazami danych, takich jak MySQL, PostgreSQL, SQL Server, MariaDB itd. Dla demonstracji zaprojektowano dwie tabele: Klienci
i Zamowienia
. Tabela Klienci
zawiera informacje o klientach, a tabela Zamowienia
zawiera informacje o zamówieniach złożonych przez klientów. Klucz obcy w tabeli Zamowienia
odnosi się do klucza głównego w tabeli Klienci
, co pozwala na śledzenie, który klient złożył które zamówienie.
Tabela „Klienci”
CREATE TABLE Klienci (
KlientID INT AUTO_INCREMENT PRIMARY KEY,
Imie VARCHAR(50),
Nazwisko VARCHAR(50),
Email VARCHAR(100),
Adres VARCHAR(200)
-- Możesz dodać więcej kolumn zgodnie z potrzebami
);
W tej tabeli KlientID
jest kluczem głównym, który jednoznacznie identyfikuje każdego klienta.
Tabela „Zamowienia”
CREATE TABLE Zamowienia (
ZamowienieID INT AUTO_INCREMENT PRIMARY KEY,
KlientID INT,
DataZamowienia DATE,
Kwota DECIMAL(10, 2),
Status VARCHAR(50),
CONSTRAINT fk_klient
FOREIGN KEY (KlientID)
REFERENCES Klienci(KlientID)
ON DELETE SET NULL
ON UPDATE CASCADE
);
W tej tabeli ZamowienieID
jest kluczem głównym. KlientID
jest kluczem obcym, który odnosi się do KlientID
w tabeli Klienci
. ON DELETE SET NULL
oznacza, że jeśli rekord klienta zostanie usunięty, wartość KlientID
w tabeli Zamowienia
zostanie ustawiona na NULL. ON UPDATE CASCADE
oznacza, że jeśli KlientID
w tabeli Klienci
zostanie zmieniony, odpowiadające mu wartości w tabeli Zamowienia
zostaną automatycznie zaktualizowane. Ta struktura jest dość uniwersalna i powinna działać w różnych systemach zarządzania bazami danych bez konieczności dokonywania znaczących zmian.
Omówienie przykładu
CONSTRAINT fk_klient
CONSTRAINT
– słowo kluczowe służące do określenia ograniczenia (constraint) w bazie danych. Ograniczenia są używane do określenia zasad dotyczących danych w tabeli. W tym przypadku tworzymy ograniczenie typu klucz obcy.- fk_klient` – nazwa, którą nadajemy naszemu ograniczeniu. „fk” zwykle oznacza „foreign key” (klucz obcy), a "klient" wskazuje na tabelę lub kontekst, do którego się odnosi. Nadanie nazwy ograniczeniu jest dobrym zwyczajem, ponieważ ułatwia identyfikację i zarządzanie ograniczeniami w przyszłości.
FOREIGN KEY (KlientID)
FOREIGN KEY
– deklaracja, że określona kolumna (lub kolumny) w tabeli jest kluczem obcym. Klucz obcy to klucz używany do łączenia dwóch tabel.(KlientID)
– określa kolumnę w bieżącej tabeli (Zamowienia
), która będzie kluczem obcym. W tym przypadkuKlientID
w tabeliZamowienia
odnosi się doKlientID
w tabeliKlienci
.
REFERENCES Klienci(KlientID)
REFERENCES
– wskazuje, do której tabeli i kolumny klucz obcy się odnosi.Klienci(KlientID)
– oznacza, że klucz obcyKlientID
w tabeliZamowienia
odnosi się do kolumnyKlientID
w tabeliKlienci
. Jest to sposób na utworzenie relacji między tymi dwoma tabelami, gdzie każde zamówienie jest powiązane z konkretnym klientem.
ON DELETE SET NULL
ON DELETE
– określa zachowanie klucza obcego, gdy odpowiadający mu rekord w tabeli nadrzędnej (tutajKlienci
) jest usuwany.SET NULL
– oznacza, że jeśli rekord klienta jest usuwany z tabeliKlienci
, to wartośćKlientID
w powiązanych rekordach w tabeliZamowienia
zostanie ustawiona na NULL. To zapobiega pozostawieniu "zawieszonych" odniesień, gdy źródłowy rekord jest usunięty.
ON UPDATE CASCADE
ON UPDATE
– podobnie jakON DELETE
, ale odnosi się do aktualizacji klucza głównego w tabeli nadrzędnej.CASCADE
– oznacza, że jeśliKlientID
w tabeliKlienci
zostanie zmieniony (np. w wyniku aktualizacji), to wszystkie odpowiadające muKlientID
w tabeliZamowienia
zostaną automatycznie zaktualizowane, aby odzwierciedlać tę zmianę. To utrzymuje spójność danych między tabelami.