étrangère - unique constraint mysql




Question MySQL-Clé unique Ne fonctionne pas correctement, ou suis-je malentendu? (3)

J'essaye de créer une relation où l'une des quatre parties différentes peut être incluse, mais n'importe quelle collection des mêmes parties devrait être traitée comme unique.

Exemple: Une affectation doit avoir une société assignée, peut éventuellement avoir un emplacement assigné, un groupe de travail et un programme. Une affectation peut ne pas avoir de groupe de travail sans emplacement.

Supposons que nous ayons des entreprises A, B, C; les emplacements X, Y, Z; groupes de travail I, J, K et programmes 1, 2, 3.

Donc, les relations valides pourraient inclure A - X - I - 1 A - Z - 2 B - Y C C - 3 B - Z - K

Mais les relations invalides incluraient A - K (Groupe de travail sans localisation) Y - K - 1 (Aucune entreprise)

Donc, pour créer ma table, j'ai créé

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

Je pense que cela permettrait de gérer toutes mes relations en plus de la nécessité d'un devoir d'avoir un lieu de travail s'il y a un groupe de travail (que je peux heureusement faire par programmation ou avec des déclencheurs, je pense)

Cependant, quand je teste ce schéma, il me permet d'entrer le suivant ...

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

... sans plainte. Je devine que (1, null, null, null) ne s'égale pas lui-même parce que les nulls sont inclus. Si c'est le cas, y a-t-il un moyen de gérer cette relation?

Toute aide serait appréciée!


C'est une caractéristique (mais pas ce à quoi je m'attendais, non plus).

Ce fil suggère de faire de votre clé une clé primaire pour obtenir le comportement attendu:

C'est une caractéristique - une valeur NULL est une valeur indéfinie, donc deux valeurs NULL ne sont pas les mêmes. Peut être un peu déroutant mais a du sens quand on y pense.

Un index UNIQUE garantit que les valeurs non NULL sont uniques; vous pouvez spécifier que votre colonne n'accepte pas les valeurs NULL.


En MySQL NULL! = NULL, ou quoi que ce soit. Voilà donc ce que l'UNIQUE ne fonctionne pas. Vous devriez utiliser une autre valeur par défaut pour les espaces, comme zéro


La seule façon de penser à gérer cela sans déclencheurs / programmation supplémentaires serait d'avoir une seule valeur "None of the Above" dans chacune des tables référencées, de sorte que votre test ressemble à

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

Où les identificateurs NO_* correspondent au type / à la longueur de vos colonnes d'ID. Cela échouerait alors, comme on s'y attendrait.





unique-key