Mysql
 sql >> Base de données >  >> RDS >> Mysql

Une seule clé de la clé primaire composite comme clé étrangère

Cette réponse prend la question "ajouter une clé étrangère à table3 " pour signifier qu'une FK (clé étrangère) a été ajoutée dans table3 référençant une des colonnes de la PK (clé primaire) composée de table4 . En SQL standard, un FK peut référencer un sous-ensemble approprié/plus petit d'un PK.

Cette autre réponse prend vraisemblablement "ajouter une clé étrangère à table3 " pour signifier qu'un FK a été ajouté dans table4 avec une des colonnes de la PK référençant table3 . Une colonne FK définie dans une table est indépendante de toute déclaration PK ou UNIQUE qu'elle contient.

En SQL standard, un FK peut référencer un sous-ensemble approprié/plus petit d'un PK.

La liste de colonnes référencée doit être déclarée PRIMARY KEY ou UNIQUE. (PRIMARY KEY crée une contrainte UNIQUE NOT NULL.) (La contrainte doit être explicite, même si tout ensemble de colonnes NOT NULL contenant un ensemble UNIQUE doit être unique.)

Malheureusement, MySQL vous permet de déclarer un FK faisant référence à une liste de colonnes qui n'est pas UNIQUE. Même si un tel FK ou un référençant des colonnes non NULL (OK en SQL standard) n'est pas implémenté correctement, et la documentation elle-même conseille de ne pas le faire :

(Vous pouvez réfléchir à ce que sont et ne sont pas les opérations bien définies, puisque la documentation ne clarifie pas réellement.)

1.8.2.3 Différences de clés étrangères
13.1.18 CRÉER UNE TABLE Syntaxe
13.1.18.6 Utiliser FOREIGN Contraintes CLÉS

PS Re relationnel vs SQL

Dans le modèle relationnel, un FK fait référence à un CK (clé candidate). Une super-clé est un ensemble de colonnes unique. Un CK est une super-clé ne contenant pas de super-clé plus petite. Un CK peut être appelé le PK (clé primaire). Lorsque les valeurs d'un ensemble de colonnes doivent apparaître ailleurs, nous disons qu'il existe un IND (dépendance d'inclusion). Un FK est un IND à un CK. Lorsqu'un IND correspond à une super-clé, nous pourrions appeler cela une "super-clé étrangère".

Un PK SQL ou UNIQUE NOT NULL déclare une super-clé. C'est un CK lorsqu'il ne contient pas un ensemble de colonnes plus petit déclaré comme SQL PK ou UNIQUE NOT NULL . SQL FK déclare une super-clé étrangère. Ainsi, un SQL PK pourrait en fait être un PK relationnel (donc CK) et un UNIQUE NOT NULL pourraient en fait être un CK. Un SQL FK à l'un d'entre eux est en fait est un FK relationnel.