web-dev-qa-db-fra.com

pouvons-nous avoir une clé étrangère qui n'est pas une clé primaire dans une autre table?

il est écrit dans chaque livre que les clés étrangères sont en réalité des clés primaires dans une autre table, mais pouvons-nous avoir une clé étrangère qui n'est pas la clé primaire dans une autre table 

36
Mac

Oui, vous pouvez avoir une clé étrangère qui référence un index unique dans une autre table.

CREATE UNIQUE INDEX UX01_YourTable ON dbo.YourTable(SomeUniqueColumn)

ALTER TABLE dbo.YourChildTable
   ADD CONSTRAINT FK_ChildTable_Table
   FOREIGN KEY(YourFKColumn) REFERENCES dbo.YourTable(SomeUniqueColumn)
42
marc_s

Par définition, une clé étrangère doit référencer une clé candidate d'une table. Cela ne doit pas nécessairement être la clé primaire.

En détail, la contrainte appelée FOREIGN KEY en SQL n'est pas exactement équivalente à la définition de manuel d'une clé étrangère dans le modèle relationnel. La contrainte FOREIGN KEY de SQL diffère pour les raisons suivantes:

  • il peut référencer n'importe quel ensemble de colonnes soumis à une contrainte d'unicité, même s'il ne s'agit pas de clés candidates (superkeys ou colonnes nullables, par exemple).
  • il peut inclure des valeurs NULL, auquel cas la contrainte n'est pas appliquée
  • sa syntaxe dépend de l'ordre des colonnes, donc une contrainte fk sur le référencement (A, B) (A, B) est différente d'une contrainte sur le référencement (B, A) (A, B).
14
nvogel

Oui, il peut y avoir une clé étrangère qui est une clé unique dans une autre table car la clé unique est un sous-ensemble de la clé primaire mais pas la clé primaire exacte. 

Il est donc possible que la clé étrangère soit une clé unique dans une autre table.

3
Giriraj Gupta

La réponse standard générale est non. Cela n'est possible que si la clé étrangère fait référence à une colonne uniquement dans une autre table. Cela signifie que la clé étrangère doit être la clé candidate dans une autre table et que la clé primaire est également une clé candidate de la table.

0
Riaj Ferdous