JeuWeb - Crée ton jeu par navigateur
MySQL, clés étrangères et valeur null - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : MySQL, clés étrangères et valeur null (/showthread.php?tid=5510)

Pages : 1 2


MySQL, clés étrangères et valeur null - Dexyne - 23-06-2011

Bonjour,

J'ai récemment été confronté a un soucis via les clés étrangères, auparavant je ne les créaient pas directement via mysql (les préciser comme des foreigns key) mais j'utilisais juste les jointures, et en les utilisant (les clés étrangères via mysql) j'ai eu le problème qui suit.
J'ai une clé étrangère qui doit contenir l'id d'une autre table, bien que j'ai mis qu'il soit possible de la mettre à null ou avec une valeur à 0 pour dire qu'il n'y a pas de relation (inexistante) mais ça ne fonctionne pas.
Je me demandais donc comment résoudre ceci ? Pour le moment j'ai créer un élément vide dans l'autre table de façon à avoir un id existant mais je ne pense pas que ce soit la meilleur solution.


RE: MySQL, clés étrangères et valeur null - Sephi-Chan - 23-06-2011

J'ai rien compris…

Montre-nous la structure des tables et quelques données de tests puis montre nous quelques requêtes avec le résultat obtenu et celui que tu attendais. Wink


RE: MySQL, clés étrangères et valeur null - Dexyne - 23-06-2011

Haha ok xD

Donc ça donne par exemple :
-Une table "poste" (du matériel en gros genre PC)
-Une table OS (système d'exploitation)

Dans la table poste on a une clé étrangère vers OS. Seulement si ce n'est pas un PC il n'y pas forcément d'OS donc j'aurais souhaité mettre la valeur à zéro ou à null pour dire qu'il n'y en a pas. Toutefois étant une clé étrangère "déclaré" dans MySQL il faut que l'id existe dans la table OS.
Pour palier à ce problème j'ai donc créer un champ vide mais qui a donc un id existant, mais j'aimerais bien savoir si une solution meilleur que celle-ci soit possible.


RE: MySQL, clés étrangères et valeur null - Sephi-Chan - 24-06-2011

Tu as le droit d'avoir une foreign key nulle. Après tu joues avec une jointure externe (LEFT JOIN, par exemple).

Dans quels cas concret de requête est-ce que ça te pose problème ?


RE: MySQL, clés étrangères et valeur null - Dexyne - 24-06-2011

En faite lorsque j'essaye d'insérer un élément non null (avec un insert) il me retourne une erreur avec le besoin d'un champ existant pour ma foreign key, si je n'ai pas un id existant il n'insère donc pas et retourne une erreur SQL (je n'ai plus l'erreur mais en me renseignant j'ai trouvé que le problème venait d'un impossibilité à avoir un champ null ou égale à 0, il fallait obligatoirement un id existant dans la table OS.


RE: MySQL, clés étrangères et valeur null - Sephi-Chan - 24-06-2011

Je suppose que c'est parce que ta foreign key a la contrainte NOT NULL. Non ?


RE: MySQL, clés étrangères et valeur null - Dexyne - 24-06-2011

Bah case 'null = oui', 'défaut = null', par contre c'est plutôt lors de la mise à jour des données qu'il bloque en faite, pour l'insertion je crois que ça va en faite XD.
C'est lors de l'update que si je met le laisse le champs précédent il me dit qu'il doit être unique (par exemple un numéro de série), il est égale à 0123456789, je charge un formulaire pré-rempli avec les données de la table et selon l'id du poste, il affiche bien les données. Toutefois si j'envoi le formulaire il me dit que le champ doit être unique, hors c'est le même j'avais regardé et trouver un ON DUPLICATE KEY mais j'ai pas bien compris si ça allait être utile dans mon cas et ce qu'il faisait.

Donc pour remplacer un champ déjà existant en UNIQUE dois-je utilisé le ON DUPLICATE KEY ? Ou bien il y autre chose à faire :o ?
Parce que ça le fait aussi pour un champs null et du coup bah si j'ai pas l'info j'ai l'air fin à ne pas pouvoir avoir de champs null x) (et en faite ça s'applique pas au foreign key mais mon problème de foreign key et de champ null est pourtant existant, je vais vérifier au cas où :o)

edit : je sais pas si tu arriveras à tout comprendre xD

edit2 : pour les foreign key voici l'erreur :
Citation :Cannot add or update a child row: a foreign key constraint fails (`db_projet`.`poste`, CONSTRAINT `poste_ibfk_10` FOREIGN KEY (`office_id`) REFERENCES `office` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE)



RE: MySQL, clés étrangères et valeur null - Dexyne - 28-06-2011

Petit up.

Je vais re-détailler mon problème (même si j'en ai plusieurs).
Pour commencer celui qui m'embête le plus est le suivant :
-J'ai un champ unique
-Lorsque je désire qu'il soit null il le peut mais une seule fois, si je tente de mettre un nouveau champ null il me retourne une erreur me disant qu'il existe déjà et qu'un champ unique ne peut exister 2 fois.

Je ne vois donc pas d'où provient mon erreur ou comment la résoudre.

La deuxième chose qui me posait problème (résolu mais partiellement je pense) est la suivant :
-J'ai une clé primaire (cp1) d'une table1.
-Une clé étrangère fk1 dans table2 lié à cp1 de table1.
-J'aimerais pouvoir mettre ce champs à null ou à 0 pour considérer l'élément comme inexistant, toutefois à cause de la foreign key il me renvoi une erreur me demandant d'avoir une relation entre mes clés / tables existantes (il n'accepte donc pas la valeur null ou 0)

Je me demandais donc comment régler ce problème. Actuellement je créer une ligne ayant un id et une valeur null dans les autres champs, et lorsque je désire mettre un champ null de ma table2 (contenant la clé étrangère) j'y insère l'id contenant la ligne avec les champs null.

J'espère que cela rend plus claire le tout Big Grin.


RE: MySQL, clés étrangères et valeur null - Ter Rowan - 28-06-2011

(28-06-2011, 10:25 AM)Dexyne a écrit : Petit up.

Je vais re-détailler mon problème (même si j'en ai plusieurs).
Pour commencer celui qui m'embête le plus est le suivant :
-J'ai un champ unique
-Lorsque je désire qu'il soit null il le peut mais une seule fois, si je tente de mettre un nouveau champ null il me retourne une erreur me disant qu'il existe déjà et qu'un champ unique ne peut exister 2 fois.

Je ne vois donc pas d'où provient mon erreur ou comment la résoudre.

je suis loin d'être au top sur ce genre de sujet cependant :
- est ce que lorsque tu parles de "mettre un nouveau champ null" tu parles de créer un nouvel enregistrement avec la valeur null sur le champ dont on parle ?

perso, je lèverai l'unicité de ton champ : NULL est une valeur comme une autre, si tu dis qu'il ne doit y avoir qu'un seul enregistrement par valeur pour ton champ, alors tu ne pourras pas avoir deux enregistrements avec la valeur NULL (à confirmer, mais ca me semble logique)




RE: MySQL, clés étrangères et valeur null - Dexyne - 28-06-2011

J'insère un premier champ avec l'id 7 par exemple puis un second avec l'id 8 (juste après) dans ce cas il considère effectivement que c'est un champ unique et que donc l'unicité ne permet pas la mise en place de 2 champs null.
Il est vrai que c'est logique mais pas complètement je trouve, étant que donné que je voudrais dire que rien n'existe, du moins que l'info n'est pas dispo, et dans le cas ou elel existe elle ne peut y être qu'une seule fois dans la table.

Je pense effectivement qu'enlever l'unicité soit la meilleur solution, je vérifierais en PHP que le champ n'existe pas déjà ('fin c'est déjà mais si je pouvais avoir MySQL derrièer qui permet d'en être sur xD).