O cheie străină este o cheie utilizată pentru a lega două tabele. Tabelul cu constrângerea cheii străine (alias „tabel copil”) este conectat la un alt tabel (alias, „tabelul părinte”). Conexiunea este între constrângerea cheii externe a tabelului copil și cheia primară a tabelului părinte.

Constrângerile cheii străine sunt utilizate pentru a ajuta la menținerea coerenței între tabele. De exemplu, dacă o înregistrare a tabelului părinte este ștearsă și tabela copil are înregistrări, sistemul ar putea șterge și înregistrările copilului.

De asemenea, ajută la prevenirea introducerii de date inexacte în tabelul copil, solicitând existența unei înregistrări de tabel părinte pentru fiecare înregistrare care este introdusă în tabelul copil.

Exemplu de utilizare

Pentru acest ghid vom arunca o privire mai atentă la tabelele pentru elev (părinte) și contactul elevului (copil).

Cheia primară a tabelului părinte

Rețineți că tabelul student are o cheie principală cu o coloană studentID.

SHOW index FROM student;
+---------+------------+----------+--------------+-------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+
| student |          0 | PRIMARY  |            1 | studentID   |
+---------+------------+----------+--------------+-------------+
1 row in set (0.00 sec) (some columns removed on the right for clarity)

Cheile primare și străine ale tabelului copil

Tabelul cu informații despre contactul elevului are o cheie principală, care este și studentID. Acest lucru se datorează faptului că există o relație unu-la-unu între cele două tabele. Cu alte cuvinte, ne așteptăm la un singur student și la o înregistrare de contact pentru fiecare student.

SHOW index FROM `student-contact-info`;
+----------------------+------------+----------+--------------+-------------+
| Table                | Non_unique | Key_name | Seq_in_index | Column_name |
+----------------------+------------+----------+--------------+-------------+
| student-contact-info |          0 | PRIMARY  |            1 | studentID   |
+----------------------+------------+----------+--------------+-------------+
1 row in set (0.00 sec) (some columns removed on the right for clarity)
SELECT concat(table_name, '.', column_name) AS 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) AS 'references'
FROM information_schema.key_column_usage
WHERE referenced_table_name IS NOT NULL
AND table_schema="fcc_sql_guides_database" 
AND table_name="student-contact-info";
+--------------------------------+-------------------+
| foreign key                    | references        |
+--------------------------------+-------------------+
| student-contact-info.studentID | student.studentID |
+--------------------------------+-------------------+
1 row in set (0.00 sec)

Exemplu de raport utilizând tabelul părinte student și tabelul copil de contact

SELECT a.studentID, a.FullName, a.programOfStudy,
b.`student-phone-cell`, b.`student-US-zipcode`
FROM student AS a
JOIN `student-contact-info` AS b ON a.studentID = b.studentID;
+-----------+------------------------+------------------+--------------------+--------------------+
| studentID | FullName               | programOfStudy   | student-phone-cell | student-US-zipcode |
+-----------+------------------------+------------------+--------------------+--------------------+
|         1 | Monique Davis          | Literature       | 555-555-5551       |              97111 |
|         2 | Teri Gutierrez         | Programming      | 555-555-5552       |              97112 |
|         3 | Spencer Pautier        | Programming      | 555-555-5553       |              97113 |
|         4 | Louis Ramsey           | Programming      | 555-555-5554       |              97114 |
|         5 | Alvin Greene           | Programming      | 555-555-5555       |              97115 |
|         6 | Sophie Freeman         | Programming      | 555-555-5556       |              97116 |
|         7 | Edgar Frank "Ted" Codd | Computer Science | 555-555-5557       |              97117 |
|         8 | Donald D. Chamberlin   | Computer Science | 555-555-5558       |              97118 |
+-----------+------------------------+------------------+--------------------+--------------------+

Concluzie

Constrângerile cheii străine sunt un instrument excelent de integritate a datelor. Faceți-vă timp pentru a le învăța bine.

La fel ca în toate aceste lucruri SQL, există MULTE MULT pentru ele decât ceea ce este în acest ghid introductiv.

Sper că acest lucru vă oferă cel puțin suficient pentru a începe.

Vă rugăm să consultați manualul pentru managerul de baze de date și să vă distrați încercând singur opțiuni diferite.