3

Je sais que dans MySQL, les contraintes UNIQUE ne traitent pas les valeurs NULL comme égales. Donc, si j'ai une contrainte unique sur ColumnX, alors deux lignes séparées peuvent avoir des valeurs de NULL pour ColumnX et cela ne viole pas la contrainte. Comment puis-je contourner cela? Je ne peux pas simplement définir la valeur à une constante arbitraire que je peux signaler, car ColumnX dans mon cas est en fait une clé étrangère à une autre table. Quelles sont mes options ici?comment puis-je configurer une contrainte d'unicité dans mysql pour les colonnes qui peuvent être nulles?

Veuillez noter que cette table a également une colonne "id" qui est sa clé primaire. Comme j'utilise Ruby on Rails, il est important de garder cette colonne id comme clé primaire.

Note 2: En réalité, ma clé unique englobe de nombreuses colonnes, et certaines d'entre elles doivent être nulles, car ce sont des clés étrangères, et une seule doit être non nulle. Ce que je suis en train d'essayer de le faire est de « simuler » une relation polymorphes d'une manière qui maintiennent l'intégrité référentielle dans la db, mais en utilisant la technique décrite dans la première option dans la solution retenue pour la question posée ici: Why can you not have a foreign key in a polymorphic association?

+0

Est-ce que l'autre colonne de la table doivent être NULL? –

+0

non - mais si la table a deux colonnes ColumnA, ColumnX, alors MySQL me permettra d'avoir deux lignes avec des valeurs (1, NULL) et (1, NULL) et cela ne violerait toujours pas la contrainte d'unicité –

Répondre

1

Si une seule des clés étrangères peut être non nulle, alors il serait peut-être préférable de restructurer votre table. Au lieu d'avoir colA | colB | colC avec un FK et deux NULL, ont à la place fkType | fkId.

fkType serait une énumération avec les options, A,B,C correspondant à vos tables étrangères. fkId serait l'ID dans la table étrangère. Vous pouvez maintenant définir une contrainte d'unicité sur (fkType,fkId).

Donc, vous pourriez avoir déjà eu:

1 | NULL | NULL 
NULL | 3 | NULL 

Maintenant, vous auriez:

A | 1 
B | 3