Pouvez colonnes de la table avec une Clé Étrangère d'être NULLE?
J'ai une table qui a plusieurs ID colonnes à d'autres tables.
Je veux une clé étrangère à la force de l'intégrité seulement si je mets de données là-bas. Si je fais une mise à jour plus tard pour remplir cette colonne, alors il doit également vérifier la contrainte.
(Il s'agit probablement de la base de données du serveur de personne à charge, je suis en utilisant MySQL & type de table InnoDB)
Je crois que c'est une attente raisonnable, mais corrigez-moi si je me trompe.
- Je ne sais pas à propos de MySQL, MS SQL Server permet de clés étrangères pour accepter les valeurs null avec la sémantique de ce que vous voulez. Je m'attends c'est le comportement standard.
- la clé étrangère, ne peut pas être null par défaut dans mySQL, la raison est simple, si vous faites référence à quelque chose et de vous laisser null, vous perdrez de l'intégrité des données. lorsque vous créez le tableau autoriser les valeurs null à PAS, puis appliquer la contrainte de clé étrangère. Vous ne pouvez pas définir la valeur null en cas de mise à jour, il doit vous envoyer une erreur, mais vous pouvez (vous devez), il suffit de ne pas mettre à jour cette colonne et de mettre à jour uniquement les champs dont vous avez besoin pour changer.
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez appliquer la contrainte uniquement lorsque la valeur n'est pas NULL. Cela peut être testé facilement avec l'exemple suivant:
La première insertion va passer parce que nous insérer une valeur NULL dans le
parent_id
. La deuxième insertion échoue à cause de la contrainte de clé étrangère, depuis que nous avons essayé d'insérer une valeur qui n'existe pas dans laparent
table.parent_id INT NULL
partie est (avec beaucoup de détails) égal àparent_id int default null
J'ai constaté que lors de l'insertion, les valeurs de colonne null avait précisément d'être déclarée NULLE, sinon, je voudrais obtenir une erreur de violation de contrainte (par opposition à une chaîne vide).
INSERT INTO {table} {list_of_columns}
? Parce que c'est vrai pour moi; d'omettre la mention de la colonne causes d'erreur, mais y compris et de manière explicite paramètre à NULL corrections d'erreur. Si je suis correct, je pense que @Gary commentaire ne s'applique pas (parce que tu ne voulais pas d'un vide-chaîne), mais @Kevin Coulombe pourrait être utile...Oui, qui va fonctionner comme vous l'attendez. Malheureusement, il me semble avoir de la difficulté à trouver un énoncé explicite de cette dans le Manuel MySQL.
Clés étrangères la valeur doit exister dans l'autre table. NULL se réfère à l'absence de valeur, de sorte que lorsque vous définissez une colonne est NULL, il ne serait pas logique d'essayer d'appliquer des contraintes sur que.
Les travaux ci-dessus mais cela ne marche pas. Remarque l'on DELETE CASCADE
Une autre façon de contourner ce problème serait d'insérer un élément par DÉFAUT dans l'autre table. Par exemple, toute référence à uuid=00000000-0000-0000-0000-000000000000 sur l'autre table indiquent aucune action. Vous devez également définir toutes les valeurs pour que id être "neutre", par exemple 0, une chaîne vide, null, afin de ne pas affecter votre code logique.
J'ai aussi bloqué sur ce problème. Mais j'ai résolu en définissant simplement la clé étrangère comme
unsigned integer
.Trouver l'exemple ci-dessous-