Maison >base de données >tutoriel mysql >Comment créer une contrainte de clé étrangère faisant référence à une colonne de clé non primaire ?

Comment créer une contrainte de clé étrangère faisant référence à une colonne de clé non primaire ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 09:32:46539parcourir

How to Create a Foreign Key Constraint Referencing a Non-Primary Key Column?

Faire référence aux clés non primaires dans les contraintes de clé étrangère

Le maintien de l'intégrité référentielle lors de la liaison de tables via des clés étrangères est une exigence courante. Cependant, cette situation se produit lorsque la table référencée par la clé étrangère ne possède pas de clé primaire correspondant à la colonne référencée.

Description du problème :

Considérez le schéma de base de données suivant :

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

Le but ici est d'appliquer une contrainte de clé étrangère entre table2.AnotherID et table1.AnotherID. Cependant, ID est la clé primaire de table1 et AnotherID ne l'est pas.

Solution :

Pour créer une contrainte de clé étrangère qui fait référence à une clé non primaire, la colonne référencée doit avoir une contrainte unique qui lui est appliquée. Selon les livres en ligne de Microsoft :

"Une contrainte FOREIGN KEY ne doit pas nécessairement être liée uniquement à une contrainte PRIMARY KEY dans une autre table ; elle peut également être définie comme une colonne qui référence une contrainte UNIQUE dans une autre table."

Ainsi, dans le schéma donné, appliquer une contrainte unique à AnotherID dans la table1 permettra la création d'une contrainte de clé étrangère.

<code class="language-sql">ALTER TABLE table1 ADD CONSTRAINT UQ_AnotherID UNIQUE (AnotherID);</code>
Cependant, il est important de noter que s'il existe une clé primaire alternative candidate, son utilisation est souvent l'approche la plus appropriée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn