2010-05-10 15 views
13

Puis-je avoir une colonne dans ma table de valeurs (valeur) référencée en tant que clé étrangère à la table des knownValues, et que ce soit NULL en cas de besoin, comme dans l'exemple:clés étrangères et NULL dans mySQL

Tableau: Valeurs

product  type  value  freevalue 
0   1  NULL  100 
1   2  NULL  25 
3   3  1   NULL 

Tableau: types

id name  prefix 
0  length cm 
1  weight kg 
2  fruit NULL 

Tableau: knownValues ​​

id Type  name 
0  2  banana 

Remarque: Les types de la table values & knownValues sont bien entendu référencés dans le tableau types.

Répondre

17

Les valeurs NULL dans les clés étrangères sont parfaitement acceptables. Traiter les valeurs NULL dans les clés étrangères est délicat mais cela ne signifie pas que vous modifiez ces colonnes à NOT NULL et insérez des enregistrements factices ("N/A", "Inconnu", "Aucune valeur", etc.) dans vos tables de référence.

L'utilisation de valeurs NULL dans des clés étrangères nécessite souvent l'utilisation de LEFT/RIGHT JOIN au lieu de INNER JOIN.

+3

L'utilisation de INNER join ou d'une sorte de jointure OUTER dépend des résultats que vous recherchez. Il y a des moments où une jointure INNER donne exactement la réponse désirée. –

+1

Oui, et dans les cas où vous avez des lignes avec des valeurs NULL dans FK, vous ne trouverez pas * toutes * lignes avec une jointure interne; mais avec une jointure externe. –

+1

des exemples? Cela ne fonctionne pas pour moi en utilisant InnoDB Storage Engine - MySQL – dev

3

Il s'agit d'une relation de 1 à zéro. Je l'ai utilisé plusieurs fois avec SQL Server. Je crois qu'il est possible de le faire avec MySQL aussi.

Je préfère éviter les valeurs NULL dans mes bases de données en raison de problèmes liés à l'agrégation de données. En fonction de ma conception, j'ai donc placé une ligne UNKNOWN dans la table de recherche.

+4

Salut Raj! Comment voulez-vous dire par "rangée inconnue"? – Industrial

1

Oui, il est tout à fait possible d'avoir une valeur NULL dans votre colonne à contrainte de clé étrangère. Je l'ai juste essayé. Gardez à l'esprit que si vous n'utilisez pas le moteur de stockage InnoDB, vos contraintes de clé étrangère seront ignorées de toute façon.

+0

Utiliser InnoDB bien sûr! – Industrial

4

Bien que vous puissiez rendre invalides les colonnes de clés étrangères, je suggérerais qu'il est généralement préférable de concevoir des tables sans clé étrangère nullable. Les valeurs nulles conduisent invariablement à certaines ambiguïtés et à des résultats incorrects, mais cela pose doublement un problème si l'on s'attend à ce que les colonnes en question fassent l'objet de contraintes.

+1

Salut David, alors comment le feriez-vous? Un tableau supplémentaire pour les valeurs de texte libre seulement? – Industrial

+1

Oui, le mettre dans une autre table est la façon évidente de le faire. Si vous représentez des faits dans des tables avec le bon ensemble d'attributs, vous n'aurez pas besoin d'utiliser des valeurs nulles pour les attributs qui ne s'appliquent pas. N'ajoutez des zéros au modèle que s'il y a un avantage particulier à le faire ou si une limitation du logiciel vous force à le faire. – sqlvogel

1

Bien sûr, il y a des possibilités pour avoir des valeurs NULL en clé étrangère, mais pour cela vous ne vous inquiétez pas, j'espère que vous pourrez utiliser InnoDB comme moteur de base de données pour gérer les contraintes clés. Pour ce cas, je suggère d'utiliser Left Join ou Right Join pour obtenir des lignes de DB et Group By peuvent être utilisés pour éviter la duplication. Merci de ne pas utiliser Inner Join.