Clé fonctionnelle non obligatoire

Clé fonctionnelle non obligatoire
0
Tags: #<Tag:0x00007f85eeef9a40>

Bonjour,

Est-il possible d’avoir une clé fonctionnelle qui n’est pas obligatoire ?

Dans mon cas, j’ai un lien 1-N entre un objet A et un objet B. Mon objet A a une clé fonctionnelle A.nom et je voudrais que le lien soit aussi une clé fonctionnelle de mon objet A mais non obligatoire car il n’est pas forcement liés à l’objet B.

J’ai paramétré cela en mettant ma foreign key fonctionnelle et non obligatoire, mais lorsque je crée une data qui ne présente pas le lien elle ne s’affiche pas dans la liste de l’objet A car il y a une clé fonctionnelle manquante.

J’ai essayé de lui mettre une valeur par défaut comme ‘-1’ ou ‘0’, dans ce cas la donnée s’affiche dans la liste de l’objet A mais je peux créer plusieurs fois le même A.nom de mon objet A qui est son autre clé fonctionnelle.

Avez-vous une solution ?

Tout compte fait, j’ai l’impression que le problème est plutôt sur le fait que le lien est un inner join alors qu’il me faudrait un left join pour l’affichage de la liste de l’objet A.
Est-il possible de modifier cela dans le paramétrage ?

Si une FK est obligatoire, il y aura un “inner join”, sinon ce sera un “outer join”.
Si un lien est non renseigné, il faut laisser vide (NULL) en base et non pas 0 ou -1, sinon quelque soit le join, il ne ramenera rien. Bref ne touchez à rien sauf à obligatoire ou facultatif sur la FK.
Que ce soit un clé fonctionnelle ou non n’a pas d’influence.

Faites du SQL direct pour vérifier ce que contient votre colonne.
il y a aussi potentiellement des liens morts suite à vos actions.

D’accord merci
Seulement j’ai bien mon attribut avec la clé fonctionnelle = oui et obligatoire = non, pourtant en inspectant les requêtes via le paramètre LOG_SQL_USER, la jointure est faite avec un inner join.
Et j’ai vérifié via l’accès BDD en base mon paramètre est bien null

Alors le loader doit forcer une clé fonctionnelle à toujours être obligatoire.

Il faut essayer de la remettre en facultatif au postLoad via setRequired(false).

C’est moi qui n’avait pas vu, il y avait une contrainte sur l’objet qui avait un impact mettant l’attribut en obligatoire et la contrainte avait pour expression true.
J’ai changé l’expression de la contrainte à :[ISNEW] || [ISCOPIED] || [CONTEXT:UPDATE]

C’est bon j’ai bien un left outer join sur la requête maintenant.
Merci