Veuillez clarifier deux choses pour moi:
- Une clé étrangère peut-elle être NULL?
- Une clé étrangère peut-elle être dupliquée?
Aussi juste que je sache, NULL
ne devrait pas être utilisé dans des clés étrangères, mais dans certaines de mes applications, je suis capable d'entrer NULL
à la fois dans Oracle et SQL Server, et je ne sais pas pourquoi.
sql
sql-server
oracle
foreign-keys
confitures
la source
la source
Réponses:
Réponse courte: Oui, il peut être NULL ou en double.
Je veux expliquer pourquoi une clé étrangère peut avoir besoin d'être nulle ou peut être unique ou non unique. Rappelez-vous d'abord qu'une clé étrangère nécessite simplement que la valeur de ce champ existe d'abord dans une autre table (la table parent). C'est tout ce qu'un FK est par définition. Nul par définition n'est pas une valeur. Null signifie que nous ne savons pas encore quelle est la valeur.
Permettez-moi de vous donner un exemple concret. Supposons que vous ayez une base de données qui stocke les propositions de vente. Supposons en outre que chaque proposition ne comporte qu'un seul commercial et un seul client. Ainsi, votre table de proposition aurait deux clés étrangères, une avec l'ID client et l'autre avec l'ID représentant commercial. Cependant, au moment de la création de l'enregistrement, un commercial n'est pas toujours affecté (car personne n'est encore libre de travailler dessus), l'ID client est donc renseigné mais l'ID commercial peut être nul. En d'autres termes, vous devez généralement avoir la possibilité d'avoir un FK nul lorsque vous ne connaissez pas sa valeur au moment où les données sont entrées, mais vous connaissez d'autres valeurs dans le tableau qui doivent être entrées. Pour autoriser les valeurs nulles dans un FK, tout ce que vous avez à faire est généralement d'autoriser les valeurs nulles sur le champ contenant le FK. La valeur nulle est distincte de l'idée qu'il s'agit d'un FK.
Qu'elle soit unique ou non unique, cela signifie que la table a une relation un-un ou un-plusieurs avec la table parent. Maintenant, si vous avez une relation un-à-un, il est possible que vous puissiez avoir les données dans une seule table, mais si la table devient trop large ou si les données sont sur un sujet différent (l'employé - exemple d'assurance @tbone a donné par exemple), alors vous voulez des tables séparées avec un FK. Vous voudrez alors faire de ce FK soit aussi le PK (qui garantit l'unicité) ou y mettre une contrainte unique.
La plupart des FK sont pour une relation un à plusieurs et c'est ce que vous obtenez d'un FK sans ajouter de contrainte supplémentaire sur le terrain. Vous avez donc une table de commande et la table des détails de la commande par exemple. Si le client commande dix articles à la fois, il a une commande et dix enregistrements de détail de commande qui contiennent le même ID de commande que le FK.
la source
NULL
une table contre plusieursNULL
dans une autre.1 - Oui, depuis au moins SQL Server 2000.
2 - Oui, tant que ce n'est pas une
UNIQUE
contrainte ou lié à un index unique.la source
De la bouche du cheval:
Regarde ça:
Lien Oracle 11g
la source
Oui, la clé étrangère peut être nulle comme indiqué ci-dessus par les programmeurs seniors ... J'ajouterais un autre scénario où la clé étrangère devra être nulle .... supposons que nous ayons des tableaux de commentaires, des images et des vidéos dans une application qui permet des commentaires sur les images et vidéos. Dans le tableau des commentaires, nous pouvons avoir deux images de clés étrangères PicturesId et VideosId avec la clé principale CommentId. Ainsi, lorsque vous commentez une vidéo, seul VideosId est requis et pictureId est nul ... et si vous commentez une image, PictureId uniquement est requis et VideosId est nul ...
la source
cela dépend du rôle que cela
foreign key
joue dans votre relation.foreign key
c'est aussi unkey attribute
dans votre relation, alors ça ne peut pas être NULLforeign key
s'agit d'un attribut normal dans votre relation, il peut être NULL.la source
Voici un exemple utilisant la syntaxe Oracle: Créons d'
abord une table COUNTRY
Créer la table PROVINCE
Cela fonctionne parfaitement bien dans Oracle. Notez que la clé étrangère COUNTRY_ID dans la deuxième table n'a pas "NOT NULL".
Maintenant, pour insérer une ligne dans la table PROVINCE, il suffit de spécifier uniquement PROVINCE_ID. Toutefois, si vous avez également choisi de spécifier un COUNTRY_ID, il doit déjà exister dans la table COUNTRY.
la source
Par défaut, il n'y a pas de contraintes sur la clé étrangère, la clé étrangère peut être nulle et dupliquée.
lors de la création d'une table / modification de la table, si vous ajoutez une contrainte d'unicité ou non nulle, alors seulement elle n'autorisera pas les valeurs nulles / dupliquées.
la source
Autrement dit, les relations «non identifiantes» entre entités font partie du modèle ER et sont disponibles dans Microsoft Visio lors de la conception du diagramme ER. Cela est nécessaire pour appliquer la cardinalité entre les entités de type "zéro ou plus de zéro" ou "zéro ou un". Notez ce "zéro" dans la cardinalité au lieu de "un" dans "un à plusieurs".
Maintenant, un exemple de relation non identificatrice où la cardinalité peut être "zéro" (non identifiant) est quand nous disons qu'un enregistrement / objet dans une entité-A "peut" ou "peut ne pas" avoir une valeur comme référence à l'enregistrement / s dans une autre entité-B.
Comme il existe une possibilité pour un enregistrement de l'entité-A de s'identifier aux enregistrements de l'autre entité-B, il devrait donc y avoir une colonne dans l'entité-B pour avoir la valeur d'identité de l'enregistrement de l'entité-B. Cette colonne peut être "Null" si aucun enregistrement dans l'entité-A n'identifie les enregistrements (ou les objets) dans l'entité-B.
Dans le paradigme orienté objet (monde réel), il existe des situations où un objet de classe B ne dépend pas nécessairement (fortement couplé) de l'objet de classe A pour son existence, ce qui signifie que la classe B est vaguement couplée à la classe. Un tel que la classe A peut "contenir" (confinement) un objet de la classe A, par opposition au concept d'objet de la classe B doit avoir (composition) un objet de la classe A, pour son (objet de la classe) B) création.
Du point de vue de la requête SQL, vous pouvez interroger tous les enregistrements de l'entité-B qui sont "non nuls" pour la clé étrangère réservée à l'entité-B. Cela apportera tous les enregistrements ayant une certaine valeur correspondante pour les lignes dans l'entité-A, sinon tous les enregistrements avec une valeur nulle seront les enregistrements qui n'ont aucun enregistrement dans l'entité-A dans l'entité-B.
la source
Je pense qu'il vaut mieux considérer la cardinalité possible que nous avons dans les tableaux. Nous pouvons avoir une cardinalité minimale possible nulle. Lorsqu'il est facultatif, la participation minimale des tuples de la table associée peut être nulle. Vous devez maintenant faire en sorte que les valeurs de clé étrangère soient autorisées à être nulles.
Mais la réponse est que tout dépend de l'entreprise.
la source
L'idée d'une clé étrangère est basée sur le concept de référencer une valeur qui existe déjà dans la table principale. C'est pourquoi il est appelé une clé étrangère dans l'autre table. Ce concept est appelé intégrité référentielle. Si une clé étrangère est déclarée comme un champ nul, elle violera la logique même de l'intégrité référentielle. À quoi fera-t-il référence? Il ne peut faire référence qu'à quelque chose qui est présent dans le tableau principal. Par conséquent, je pense qu'il serait faux de déclarer un champ de clé étrangère nul.
la source
NULL
, mais ce que l'intégrité référentielle dit, c'est que s'il fait référence à «quelque chose», il doit être là.Je pense que la clé étrangère d'une table est également la clé primaire d'une autre table.Ainsi, elle n'autorise pas les valeurs nulles.
la source