Cheie externă

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 11 decembrie 2021; verificarea necesită 1 editare .

Cheie străină ( ing.  cheie străină ) - conceptul teoriei bazelor de date relaționale , referitor la constrângerile asupra integrității bazei de date .

Informal vorbind, o cheie străină este un subset de atribute ale unei variabile de relație R 2 ale cărei valori trebuie să se potrivească cu valorile unei chei potențiale a unei variabile de relație R 1 .

Definiție formală. Fie R 1 și R 2  două variabile relaționale, nu neapărat distincte. O cheie externă FK în R2 este un subset al atributelor variabilei R2 astfel încât să fie îndeplinite următoarele cerințe :

  1. Variabila de relație R1 are o potențială cheie CK , astfel încât FK și CK coincid până la redenumirea atributelor (adică, prin redenumirea unui subset de atribute FK , se poate obține un astfel de subset de atribute FK ' încât FK' și CK coincid ambele ca nume și în tipuri de atribute).
  2. La orice moment dat, fiecare valoare FK din valoarea curentă R2 este identică cu valoarea CK dintr - un tuplu din valoarea curentă R1 . Cu alte cuvinte, în orice moment dat, setul tuturor valorilor FK din R 2 este un subset (nestrict) al valorilor CK din R 1 .

Mai mult, pentru această cheie străină particulară FK → CK , relația R1 care conține cheia potențială este numită relație principală , țintă sau părinte , iar relația R2 care conține cheia externă este numită relație subordonată sau copil .

Menținerea cheilor străine este denumită și menținerea integrității referențiale . SGBD-urile relaționale acceptă controlul automat al integrității referențiale.

Exemplu

Să presupunem că există două tabele în baza de date: Oraș (orașe) și Stradă (străzi), care sunt definite după cum urmează:

CREATE TABLE City ( id INTEGER NOT NULL PRIMARY KEY , numele CHAR ( 40 ) ) CREATE TABLE Strada ( id INTEGER NOT NULL PRIMARY KEY , numele CHAR ( 40 ), id_city INTEGER NOT NULL REFERINȚE STRĂINE CHEIE Oraș ( id ) )

Conținutul acestor tabele este următorul:

ORAȘ

ID NUME
unu Moscova
2 St.Petersburg
3 Vladivostok

STRADĂ

ID NUME ID_CITY
181 Malaya Bronnaya unu
182 Bulevardul Tverskoy unu
183 Bulevardul Nevski 2
184 Pușkinskaia 2
185 Svetlanskaya 3
186 Pușkinskaia 3

Tabelul STREET are un câmp ID_CITY, care este o cheie străină și se referă la tabelul CITY. Valoarea din acest câmp corespunde cheii primare din tabelul CITY pentru orașul în care se află strada. Astfel, Nevsky Prospekt are ID_CITY=2, care corespunde Sankt Petersburgului (ID=2 în tabelul CITY).

Tabelul STREET conține două străzi cu același nume Pushkinskaya, care diferă prin valoarea câmpului ID_CITY. Unul dintre ele este situat în Sankt Petersburg (ID_CITY=2), celălalt este în Vladivostok (ID_CITY=3).

O încercare de a adăuga strada „Deribasovskaya” cu ID_CITY=4 la tabelul STREET va provoca o eroare de încălcare a integrității referențiale, deoarece nu există niciun oraș cu ID=4 în tabelul CITY. Cu toate acestea, după adăugarea orașului „Odessa” cu ID=4 la tabelul CITY, reintrarea străzii „Deribasovskaya” cu ID_CITY=4 va avea succes.

Când ștergeți orașul Vladivostok din tabelul CITY, rezultatul depinde de proprietățile cheii externe:

  • Dacă ștergerea prin lanț este permisă pentru cheia străină, atunci străzile Svetlanskaya și Pushkinskaya cu ID=3 vor fi șterse odată cu ștergerea orașului Vladivostok.
  • Dacă ștergerea lanțului este dezactivată pentru cheia externă, atunci operația va genera o eroare de încălcare a integrității referențiale, deoarece tabelul STREET va conține străzi cu codul ID_CITY=3, care nu se află în tabelul CITY.

Când schimbați codul orașului Sankt Petersburg de la 2 la 48 în tabelul CITY, rezultatul depinde de proprietățile cheii străine:

  • Dacă cheia străină este permisă să se schimbe de-a lungul lanțului, atunci odată cu modificarea codului din Sankt Petersburg, valorile ID_CITY pentru străzile corespunzătoare vor fi modificate.
  • Dacă cheia străină nu este permisă să fie modificată într-un lanț, atunci operația va provoca o eroare de încălcare a integrității referențiale, deoarece tabelul STREET va conține străzi cu codul ID_CITY=2, care nu se află în tabelul CITY.

Literatură

  • Data CJ Introducere în sistemele de baze de date = Introducere în sistemele de baze de date. - Ed. a 8-a. - M . : „Williams” , 2006. - 1328 p. — ISBN 0-321-19784-4 .