Omejitev FOREIGN KEY se uporablja za preprečevanje dejanj, ki bi uničila povezave med tabelami. FOREIGN KEY (slo. Tuji ključ) je polje v eni tabeli, ki se nanaša na PRIMARY KEY (slo. Primarni ključ) v drugi tabeli. Tabela s FOREIGN KEY (tujim ključem) se imenuje podrejena tabela, tabela s PRIMARY KEY (primarnim ključem) pa referenčna ali nadrejena tabela. Najprej si bomo izdelali PRIMARY KEY tabelo z imenom stranke, ki mora vsebovati UNIQUE vrednosti in ne sme vsebovati NULL vrednosti.
CREATE TABLE stranke ( id INT PRIMARY KEY AUTO_INCREMENT UNIQUE NOT NULL, ime VARCHAR(50), priimek VARCHAR(100) );
V tabelo vnesemo nekaj podatkov:
INSERT INTO stranke (ime, priimek) VALUES ('Janko', 'Kupec'), ('Metka', 'Nabava'), ('Peter', 'Kadilec'), ('Borut', 'Oglednik'), ('Barbara', 'Zapravljivka');
Poglejmo, kaj smo vpisali:
SELECT * FROM stranke;
V naslednjem primeru bomo naredili povezavo meda tabelama stranke in transakcije prek id tabele stranke. Naredimo tabelo transakcije in tretji stolpec bo vseboval zaporedno številko tabele stranke, kateri bomo dodali FOREIGN KEY
CREATE TABLE transakcije ( id_transakcije INT PRIMARY KEY AUTO_INCREMENT, vsota DECIMAL(5, 2), id INT, FOREIGN KEY (id) REFERENCES stranke(id) );
V to pravkar narejeno tabelo bomo vpisali podatke, koliko je določena stranka zapravila.
INSERT INTO transakcije (vsota, id) VALUES (199.45, 5), (1122.99, 3), (45.97, 1), (9.99, 4), (27.99, 2);
Preverimo v transakcijah, kaj smo vpisali in kaj dobimo izpisano:
SELECT * FROM transakcije;
Vse, kar smo napisali sedaj je v redu in razumljivo, ampak ni nam še čisto jasno, kaj FOREIGN KEY sploh predstavlja, vemo pa za PRIMARY KEY. Prednost tujega ključa (ang. FOREIGN KEY) je v tem, da imamo narejeno povezavo med tabelama stranke in transakcije. MySQL bo preprečil kakršna koli dejanja, ki bi uničila to povezavo med njima, razen če eksplicitno izbrišemo ta tuji ključ (ang. FOREIGN KEY). V naslednjem primeru bomo izbrisali stranko z zaporedno številko (id) 5.
DELETE FROM stranke WHERE id = 5;
Kot vidimo se je res ne da izbrisati, dobimo napako:
[2024-05-31 20:00:45] [23000][1451] (conn=22) Cannot delete or update a parent row: a foreign key constraint
fails (`baza_podatkov`.`transakcije`, CONSTRAINT `transakcije_ibfk_1` FOREIGN KEY (`id`) REFERENCES `stranke`
(`id`))
(slo. [2024-05-31 20:00:45] [23000][1451] (conn=22) Nadrejene vrstice ni mogoče izbrisati ali posodobiti:
omejitev tujega ključa ne deluje (`baza_podatkov`.`transakcije`, CONSTRAINT `transakcije_ibfk_1` FOREIGN KEY
(`id`) REFERENCES `stranke` (`id`))
To je omejitev (ang. CONSTRAINTS) tujega ključa (ang. FOREIGN KEY), ključ (PRIMARY KEY) iz ene tabele, je prav tako najden v drugi tabeli, ampak ko delamo z drugo tabelo, ta ključ imenujemo tuji ključ (ang. FOREIGN KEY).
FOREIGN KEY lahko tudi izbrišemo, in sicer v tabeli, ki FOREIGN KEY vsebuje:
ALTER TABLE transakcije DROP FOREIGN KEY transakcije_ibfk_1;
In ko pritisnemo na Execute (slo. Izvedi) bo FOREIGN KEY izginil.
Poglejmo si še zadnji primer, kjer bomo FOREIGN KEY dodali v tabelo. Pri dodajanju tujega ključa (ang. FOREIGN KEY) tabeli, ime lahko spremenimo (ni obvezno), kjer uporabimo stavek CONSTRAINT.
ALTER TABLE transakcije ADD CONSTRAINT tk_id_stranke FOREIGN KEY (id) REFERENCES stranke(id);