SQL fremmed nøgle VS primær nøgle forklaret med MySQL-syntakseksempler

En fremmed nøgle er en nøgle, der bruges til at linke to tabeller. Tabellen med Foreign Key Constraint (også kaldet "underordnet tabel") er forbundet til en anden tabel (også kaldet "overordnet tabel"). Forbindelsen er mellem underordnet bordets fremmednøglebegrænsning og overordnetabellens primære nøgle.

Udenlandske nøglebegrænsninger bruges til at opretholde konsistensen mellem tabellerne. For eksempel, hvis en overordnet tabelpost slettes, og den underordnede tabel har poster, kan systemet også slette underordnede poster.

De hjælper også med at forhindre indtastning af unøjagtige data i underordnet tabel ved at kræve, at der findes en overordnet tabeloptegnelse for hver post, der er indtastet i underordnet tabel.

Eksempel på anvendelse

For denne vejledning vil vi se nærmere på tabellerne studerende (forælder) og studiekontakt (barn).

Overordnetabellens primære nøgle

Bemærk, at elevtabellen har en primærnøgle med en kolonne til 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) 

Barnebordets primære og udenlandske nøgler

Studentens kontaktoplysningstabel har en primær nøgle, der også er studentID. Dette skyldes, at der er en en-til-en-relation mellem de to tabeller. Med andre ord forventer vi kun en studerende og en studerendes kontaktrekord pr. Studerende.

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) 

Eksempel på rapport ved hjælp af elevens overordnede tabel og kontakt underordnet tabel

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 | +-----------+------------------------+------------------+--------------------+--------------------+ 

Konklusion

Udenlandske nøglebegrænsninger er et godt dataintegritetsværktøj. Tag dig tid til at lære dem godt.

Som med alle disse SQL-ting er der MEGET MERE til dem end hvad der er i denne introduktionsvejledning.

Jeg håber, at dette i det mindste giver dig nok til at komme i gang.

Se vejledningen til din databaseadministrator og have det sjovt selv at prøve forskellige muligheder.