Svrha foreign keya (spoljnog ključa) u sistemu za upravljanje bazama podataka jeste obezbeđenje referencijalnog integriteta. Šta to znači? Dakle, pomoću spoljnih ključeva, definišemo relacije između tabela u bazi, odnosno kako su te tabele međusobno povezane. Referencijalni integritet se odnosi na operacije UPDATE i DELETE. On nam omogućava da pri brisanju nekog zapisa iz jedne tabele ne narušimo integritet zapisa u drugoj tabeli. Na primer, imamo dve tabele:
Film (
filmid, nazivFilma, reziserid)
Reziser (
reziserid, imeRezisera, prezimeRezisera)
Tabela Film je povezana sa tabelom Reziser pomoću spoljnog ključa reziserid. Ako želimo da dodamo film "Jurassic Park" koji je režirao Steven Spielberg, najpre dodajemo režisera u tabelu Režiser:
Code:
INSERT INTO Reziser (reziserid, imeRezisera, prezimeRezisera) VALUES (100, 'Steven', 'Spielberg')
Sada dodajemo novi film u tabelu Film:
Code:
INSERT INTO Film (filmid, nazivFilma, reziserid) VALUES (1, 'Jurassic Park', 100)
Ovde problem nastaje ako želimo da izbrišemo Spielberga iz tabele Reziser. Ukoliko sistem za upravljanje bazom podataka ne podržava spoljni ključ, tada
će brisanje Spielberga uspešno proći. Problem će se ispoljiti u samom programu (ili web aplikaciji) koji koristi bazu. Recimo, pri listanju filmova, u koloni Reziser ćemo umesto Spielbergovog imena dobiti poruku o grešci.
Ukoliko pak sistem za upravljanje bazom podataka podržava spoljne ključeve, moguće mu je zadati na koji način da rešava problem referencijalnog integriteta pri izvršavanju operacije UPDATE i DELETE. To može biti CASCADE (brisanje oba povezana zapisa, u našem primeru će se izbrisati i Spielberg i Jurassic Park), RESTRICT (neće se dozvoliti brisanje Spielberga ukoliko u povezanoj tabeli Film postoji makar jedan film koji je on režirao) i SET NULL (Spielberg će se izbrisati, ali će vrednost atributa reziserid za zapis Jurassic Park biti postavljen na NULL vrednost, umesto nekadašnje vrednosti 100).
Kod MySQL sistema za upravljanje bazom, samo InnoDB engine podržava spoljne ključeve, ostali engine-i to ne podržavaju. Međutim, i u tom slučaju se može rešiti problem referencijalnog integriteta, ali taj problem rešava programer aplikacije, postavljanjem dodatnih uslova za brisanje i ažuriranje zapisa. Naravno, to znači i više posla za programera.
Prednost InnoDB engine-a jeste prisustvo spoljnih ključeva, ali su njegov glavni nedostatak performanse, koje su neuporedivo bolje kod engine-a MyISAM (koji za sada ne podržava spoljne ključeve). Razlika u performansama se neće primetiti kod malih baza podataka, ali kod većih baza, sa mnoštvom tabela i zapisa to može predstavljati veliki problem.