SQL-Fremdschlüssel gegen Primärschlüssel, erklärt mit MySQL-Syntaxbeispielen

Ein Fremdschlüssel ist ein Schlüssel zum Verknüpfen zweier Tabellen. Die Tabelle mit der Fremdschlüsseleinschränkung (auch als "untergeordnete Tabelle" bezeichnet) ist mit einer anderen Tabelle (auch als "übergeordnete Tabelle" bezeichnet) verbunden. Die Verbindung besteht zwischen der Fremdschlüsseleinschränkung der untergeordneten Tabelle und dem Primärschlüssel der übergeordneten Tabelle.

Fremdschlüsseleinschränkungen werden verwendet, um die Konsistenz zwischen den Tabellen aufrechtzuerhalten. Wenn beispielsweise ein übergeordneter Tabellendatensatz gelöscht wird und die untergeordnete Tabelle Datensätze enthält, kann das System auch die untergeordneten Datensätze löschen.

Sie tragen auch dazu bei, die Eingabe ungenauer Daten in die untergeordnete Tabelle zu verhindern, indem für jeden in die untergeordnete Tabelle eingegebenen Datensatz ein übergeordneter Tabellendatensatz erforderlich ist.

Anwendungsbeispiel

In diesem Handbuch werden die Tabellen für Schüler (Eltern) und Schüler (Kinder) näher betrachtet.

Der Primärschlüssel der übergeordneten Tabelle

Beachten Sie, dass die Schülertabelle einen einspaltigen Primärschlüssel von studentID enthält.

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) 

Primär- und Fremdschlüssel der untergeordneten Tabelle

Die Tabelle mit den Kontaktinformationen für Schüler enthält einen Primärschlüssel, der auch die Schüler-ID ist. Dies liegt daran, dass zwischen den beiden Tabellen eine Eins-zu-Eins-Beziehung besteht. Mit anderen Worten, wir erwarten nur einen Schüler und einen Schülerkontaktdatensatz pro Schüler.

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) 

Beispielbericht unter Verwendung der übergeordneten Schülertabelle und der untergeordneten Kontakttabelle

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

Fazit

Fremdschlüsseleinschränkungen sind ein hervorragendes Tool für die Datenintegrität. Nehmen Sie sich Zeit, um sie gut zu lernen.

Wie bei all diesen SQL-Dingen steckt VIEL MEHR dahinter als in diesem Einführungshandbuch.

Ich hoffe, das gibt Ihnen zumindest genug, um loszulegen.

Bitte lesen Sie das Handbuch für Ihren Datenbankmanager und haben Sie Spaß daran, verschiedene Optionen selbst auszuprobieren.