J'ai une table qui a plusieurs colonnes d'identification vers d'autres tables.
Je veux qu'une clé étrangère ne force l'intégrité que si j'y mets des données. Si je fais une mise à jour ultérieurement pour remplir cette colonne, elle doit également vérifier la contrainte.
(Cela dépend probablement du serveur de base de données, j'utilise le type de table MySQL et InnoDB)
Je crois que c'est une attente raisonnable, mais corrigez-moi si je me trompe.
sql
mysql
database
foreign-keys
cintreuse
la source
la source
Réponses:
Oui, vous ne pouvez appliquer la contrainte que lorsque la valeur n'est pas NULL. Cela peut être facilement testé avec l'exemple suivant:
Le premier insert passera car nous insérons un NULL dans le
parent_id
. La deuxième insertion échoue en raison de la contrainte de clé étrangère, car nous avons essayé d'insérer une valeur qui n'existe pas dans laparent
table.la source
parent_id INT NULL
partie est (verbalement) égale àparent_id int default null
int
au lieu deInteger
dans vos membres de classe, la valeur par défaut ne sera jamais nulle, mais sera 0 et vous échouerez à la contrainte.J'ai trouvé que lors de l'insertion, les valeurs de colonne nulles devaient être spécifiquement déclarées comme NULL, sinon j'obtiendrais une erreur de violation de contrainte (par opposition à une chaîne vide).
la source
INSERT INTO {table} {list_of_columns}
? Parce que c'est vrai pour moi; L'omission de la mention de la colonne provoque une erreur, mais l'inclusion et la définition explicite de la valeur NULL corrige l'erreur. Si j'ai raison, je pense que le commentaire de @ Gary ne s'applique pas (parce que vous ne vouliez pas dire une chaîne vide), mais @Kevin Coulombe pourrait être utile ...Oui, cela fonctionnera comme vous vous y attendez. Malheureusement, je semble avoir du mal à trouver une déclaration explicite à ce sujet dans le manuel MySQL .
Les clés étrangères signifient que la valeur doit exister dans l'autre table. NULL fait référence à l'absence de valeur, donc lorsque vous définissez une colonne sur NULL, cela n'aurait aucun sens d'essayer d'imposer des contraintes sur cela.
la source
Ce qui précède fonctionne mais cela ne fonctionne pas. Notez le ON DELETE CASCADE
la source
Oui, la valeur peut être NULL, mais vous devez être explicite. J'ai déjà vécu cette même situation auparavant, et il est facile d'oublier POURQUOI cela se produit, et il faut donc un peu de temps pour se rappeler ce qui doit être fait.
Si les données soumises sont converties ou interprétées comme une chaîne vide, cela échouera. Cependant, en définissant explicitement la valeur sur NULL lors de l'insertion ou de la mise à jour, vous êtes prêt à partir.
Mais c'est le plaisir de la programmation, n'est-ce pas? Créer nos propres problèmes et les résoudre! À votre santé!
la source
Une autre solution consiste à insérer un élément DEFAULT dans l'autre table. Par exemple, toute référence à uuid = 00000000-0000-0000-0000-000000000000 sur l'autre table n'indiquerait aucune action. Vous devez également définir toutes les valeurs pour que cet identifiant soit "neutre", par exemple 0, chaîne vide, null afin de ne pas affecter votre logique de code.
la source
Je suis également resté sur cette question. Mais j'ai résolu simplement en définissant la clé étrangère comme
unsigned integer
. Trouvez l'exemple ci-dessous-la source