Une clé étrangère peut-elle être nulle et/ou dupliquée?

s'il vous plaît clarifiez deux choses pour moi:

  1. une clé étrangère peut-elle être nulle?
  2. une clé étrangère peut-elle être dupliquée?

aussi juste que je sache, NULL ne devrait pas être utilisé dans les clés étrangères, mais dans une certaine application de la mienne je suis capable d'entrer NULL à la fois dans Oracle et SQL Server, et je ne sais pas pourquoi.

207
demandé sur halfer 2011-09-27 21:57:45
la source

10 ответов

brève réponse: oui, elle peut être nulle ou en double.

je veux expliquer pourquoi une clé étrangère doit être nulle ou doit être unique ou non. Rappelez-vous d'abord qu'une clé étrangère exige simplement que la valeur dans ce champ existe d'abord dans une table différente (la table mère). C'est tout ce qu'un FK est par définition. Null, par définition, n'est pas une valeur. Null signifie que nous ne savons pas encore quelle en est la valeur.

laissez-moi vous donner un vrai par exemple la vie. Supposons que vous ayez une base de données qui stocke les propositions de vente. Supposons en outre que chaque proposition n'ait qu'un seul vendeur et un seul client. Votre table de proposition aurait donc deux clés étrangères, une avec L'identification du client et l'autre avec l'identification du vendeur. Cependant, au moment de la création du dossier, un représentant des ventes n'est pas toujours assigné (parce que personne n'est encore libre de travailler dessus), donc L'ID du client est rempli mais l'ID du représentant des ventes pourrait être nul. En d'autres termes, généralement, vous devez la possibilité d'avoir un null FK quand 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 nulls dans un FK généralement tout ce que vous avez à faire est d'autoriser les nulls sur le champ qui a le FK. La valeur nulle est séparée de l'idée que c'est un FK.

s'il est unique ou non, il s'agit de savoir si la table a une relation un-un ou plusieurs avec la table mère. Maintenant, si vous avez un un-un relation, il est possible que vous puissiez avoir toutes les données dans une table, mais si la table devient trop large ou si les données sont sur un sujet différent (l'exemple d'assurance des employés @tbone a donné par exemple), alors vous voulez des tables séparées avec un FK. Vous souhaitez faire de cette FK soit aussi le PK (qui garantit l'unicité) ou mettre une contrainte d'unicité.

la plupart des FK sont pour une relation un à plusieurs et c'est ce que vous obtenez d'un FK sans ajouter un contrainte supplémentaire sur le terrain. Vous avez donc une table order et la table order details par exemple. Si le client commande dix articles à la fois, il dispose d'un dossier de commande et de dix dossiers détaillés qui contiennent le même identifiant que le FK.

366
répondu HLGEM 2017-09-19 15:35:09
la source

1 - Oui, depuis au moins SQL Server 2000.

2-Oui, tant que ce n'est pas une contrainte UNIQUE ou liée à un index unique.

45
répondu JNK 2011-09-27 22:02:22
la source

De la bouche des chevaux:

les clés étrangères permettent des valeurs clés qui sont toutes nulles, même s'il n'y a pas appariement des clés primaires ou uniques

aucune contrainte sur la clé étrangère

Lorsqu'aucune autre contrainte n'est définie sur la clé étrangère, n'importe quel nombre des lignes dans la table d'enfant peuvent renvoyer à la même valeur de clé de parent. Ce modèle permet à null dans la clé étrangère. ...

contrainte non nulle sur la clé étrangère

lorsque les NULL sont une clé étrangère, chaque ligne de la table enfant doit faire explicitement référence à une valeur dans la clé mère parce que nulls ne sont pas autorisés dans l'étranger clé.

N'importe quel nombre de lignes dans la table enfant peut faire référence au même parent valeur clé, donc ce modèle établit une relation de un à plusieurs entre le parent et l' les clés étrangères. Cependant, chaque ligne de l'enfant le tableau doit avoir une référence à une valeur clé parente; l'absence d'une valeur (null) dans la clé étrangère n'est pas autorisé. Le même exemple dans la section précédente peut être utilisée pour illustrer une telle relation. Toutefois, dans ce cas, les employés doivent avoir une référence à un ministère.

contrainte UNIQUE sur la clé étrangère

quand une contrainte UNIQUE est défini sur la clé étrangère, une seule ligne dans la table enfant peut référence d'une valeur clé de parent donnée. Ce modèle permet des NULL dans le clé étrangère.

Ce modèle établit une relation un-à-un entre le parent et les clés étrangères qui permet indéterminée valeurs (null) dans le clé étrangère. Par exemple, supposons que la table des employés comporte une colonne nommé MEMBERNO, faisant référence à un numéro de membre du personnel dans le la compagnie d'assurance. Aussi, une table nommée L'ASSURANCE a pour principale clé nommée MEMBERNO, et d'autres colonnes de la table de garder respectifs renseignements relatifs à une police d'assurance des employés. Le MEMBERNO in la table des employés doit être à la fois une clé étrangère et une clé unique:

  • pour appliquer les règles d'intégrité référentielle entre L'EMP_TAB et Tableaux D'assurance (la contrainte de la clé étrangère)

  • pour garantir que chaque employé a numéro de membre unique (le Contrainte clé UNIQUE)

UNIQUE et les Contraintes not NULL sur la Clé Étrangère

lorsque les deux et non des contraintes nulles sont définies sur la clé étrangère, une seule ligne dans la table enfant peut faire référence à une valeur clé de parent donnée, et parce que Les valeurs nulles ne sont pas autorisées dans la clé étrangère, chaque ligne de l'enfant le tableau doit mentionner explicitement une valeur dans la clé parente.

voir ceci:

Oracle 11g lien

35
répondu tbone 2016-10-06 00:42:49
la source

Oui clé étrangère peut être null comme indiqué ci-dessus par les programmeurs principaux... J'ajouterais un autre scénario où la clé étrangère devra être nulle.... supposons que nous ayons des tableaux, des commentaires, des photos et des vidéos dans une application qui permet des commentaires sur des photos et des vidéos. Dans la table de commentaires nous pouvons avoir deux clés étrangères PicturesId, et VideosId avec la clé primaire CommentId. Ainsi, lorsque vous commentez une vidéo, seul VideosId est requis et pictureId est null... et si vous avez des commentaires sur une image, seul PictureId serait requis et VideosId serait nul...

10
répondu Touseef Ahmed Awan 2016-01-08 20:41:39
la source

cela dépend du rôle que joue ce foreign key dans votre relation.

  1. si ce foreign key est aussi un key attribute dans votre relation, alors il ne peut pas être nul
  2. si cet foreign key est un attribut normal dans votre relation, alors il peut être nul.
5
répondu shinxg 2018-06-28 06:32:09
la source

voici un exemple utilisant la syntaxe Oracle:

Tout d'abord, nous allons créer un pays de la table

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

créer la PROVINCE de la table

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;

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 le PROVINCIE_ID. Toutefois, si vous avez choisi de préciser COUNTRY_ID aussi, il doit exister déjà dans le tableau des pays.

3
répondu Mouhcine 2014-12-19 18:46:31
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 null, alors seulement elle n'autorisera pas les valeurs null/ duplicate.

1
répondu nitin lalwani 2017-12-20 22:54:01
la source

simplement dit," Non-identification " relations entre les entités fait partie de ER-Model et est disponible dans Microsoft Visio lors de la conception de ER-Diagramme. Ceci est requis pour imposer la cardinalité entre les entités de type "zéro ou plus de zéro", ou"zéro ou un". Note ce "zéro" dans la cardinalité au lieu de "un" dans "un à plusieurs".

maintenant, exemple de relation de non-identification où la cardinalité peut être "zéro" (non-identification) est quand nous disons un document / objet dans un l'entité "peut" ou "ne peut pas" ont une valeur comme une référence à l'enregistrement/s dans une autre Entité-B.

comme, il est possible qu'un document de l'entité-a s'identifie aux documents de l'autre entité-B, il devrait donc y avoir une colonne dans L'entité-B pour avoir l'identité-valeur du document de L'entité-B. Cette colonne peut être "nulle" si aucun document dans L'entité-a identifie le/Les document (s) dans L'entité-B.

Orientées Objet (dans le monde réel) Paradigme, il y a des situations où un objet de la Classe-B ne dépend pas nécessairement (fortement couplé) de l'objet de la classe-A pour son existence, ce qui signifie que la Classe-B est vaguement couplée à la Classe-A de sorte que la classe-a peut "contenir" 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 dans entity-B qui sont "non nulles" pour la clé étrangère réservée à L'entité-B. tous les enregistrements ayant une certaine valeur correspondante pour les lignes dans L'entité-A seront alors considérés comme des enregistrements N'ayant pas de valeur nulle dans L'entité-A dans L'entité-B.

0
répondu Fakhar 2017-10-31 08:57:31
la source

je pense qu'il est préférable de considérer la possible cardinalité que nous avons dans les tableaux. Nous pouvons avoir un minimum possible de cardinalité zéro. Quand il est facultatif, la participation minimum de tuples de la table liée pourrait être zéro, maintenant vous faites face à la nécessité de valeurs clés étrangères pour être autorisé null.

Mais la réponse est tout dépend de l'Entreprise.

-1
répondu user9274383 2018-01-27 01:28:10
la source

je pense clé étrangère d'une table aussi clé primaire à une autre table.Donc il ne permet pas nulls.Il n'est donc pas question d'avoir une valeur nulle dans la clé étrangère.

-5
répondu user4532553 2015-02-05 13:53:52
la source

Autres questions sur