Heim >Datenbank >MySQL-Tutorial >Wann sollten Sie einen Fremdschlüssel für eine Nicht-Primärschlüsselspalte verwenden?
Fremdschlüsseleinschränkungen und Nicht-Primärschlüsselspalten
Relationale Datenbanken nutzen Fremdschlüsseleinschränkungen, um die referenzielle Integrität zwischen Tabellen aufrechtzuerhalten. Während Fremdschlüssel normalerweise auf Primärschlüssel verweisen, gibt es Fälle, in denen der Verweis auf eine Nicht-Primärschlüsselspalte erforderlich ist.
Szenarioillustration
Lassen Sie uns zwei Tabellen untersuchen, table1
und table2
:
<code class="language-sql">CREATE TABLE table1 ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, AnotherID INT NOT NULL, SomeData VARCHAR(100) NOT NULL ); CREATE TABLE table2 ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, AnotherID INT NOT NULL, MoreData VARCHAR(30) NOT NULL, CONSTRAINT fk_table2_table1 FOREIGN KEY (AnotherID) REFERENCES table1 (AnotherID) );</code>
Hier ist eine Fremdschlüsselbeziehung zwischen table2
und table1
unter Verwendung der Spalte AnotherID
erwünscht, die in table1
kein Primärschlüssel ist.
Erstellen eines Fremdschlüssels zu einem Nicht-Primärschlüssel
Obwohl weniger häufig, ist das Erstellen eines Fremdschlüssels, der auf eine Nicht-Primärschlüsselspalte verweist, möglich. Für die Nicht-Primärschlüsselspalte muss jedoch eine eindeutige Einschränkung erzwungen werden:
<code class="language-sql">ALTER TABLE table1 ADD CONSTRAINT UQ_AnotherID UNIQUE (AnotherID);</code>
Diese eindeutige Einschränkung garantiert die Einzigartigkeit der AnotherID
-Werte innerhalb von table1
und ermöglicht so deren Verwendung als Fremdschlüsselziel.
Empfohlene Alternative
Im Idealfall sollten Fremdschlüssel für eine stärkere referenzielle Integrität auf Primärschlüssel verweisen. Wenn möglich, entwerfen Sie Ihr Datenbankschema neu, um die table1
-Spalte von ID
als Fremdschlüsselziel in table2
zu verwenden. Dadurch entfällt die Notwendigkeit, eindeutige Einschränkungen für Nicht-Primärschlüsselspalten zu verwalten.
Das obige ist der detaillierte Inhalt vonWann sollten Sie einen Fremdschlüssel für eine Nicht-Primärschlüsselspalte verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!