2009-06-12 14 views
3

Dans postgres nous avons une contrainte définie qui permet essentiellement de limiter à un le nombre d'entrées dans une table avec une certaine valeur. Nous avons créé cette contrainte:Contrainte unique avec conditions dans MYSQL

créer une liste d'index unique $ default $ uk sur list_group (visitor_uid) où list_type = 'default';

Cela signifie que la contrainte unique est uniquement appliquée lorsque list_type = 'default', de sorte qu'il ne peut y avoir qu'une seule liste 'par défaut' par visiteur dans la table.

Il semblerait que MySql ne prenne pas en charge l'espace supplémentaire sur la contrainte unique. Existe-t-il un autre moyen de supporter cela dans le schéma de base de données pour MySQL? MYSQL ne supporte pas de tels types de contraintes.

Répondre

2

Vous devez utiliser des procudures stockées pour insérer des données à la place, afin de pouvoir effectuer des vérifications et des validations. Pourquoi ne définissez-vous pas votre valeur par défaut de telle sorte qu'elle doit avoir 1 comme clé primaire? De cette façon, une contrainte unique normale sur le pk serait déjà suffisante.

Si rien ne vous convient, vous pouvez également envisager de modifier votre modèle de données.

0

En fait, il existe. La plupart des contraintes dépendent de la table Engine. Je pense que InnoDB soutient cela.

Pour ce faire, vous devez ajouter un index unique avec la combinaison unique:

ALTER TABLE visitor ADD UNIQUE unique_default_visitor(visitor_uid, list_type); 
+0

ouais - pas tout à fait. Le problème avec ce que vous avez, c'est que chaque liste_group devrait avoir un type_list unique pour chaque visiteur. Nous ne le voulons pas. Ce que nous essayons d'accomplir est de permettre à chaque visiteur d'avoir un seul groupe de liste avec list_type = 'default'. Pour les autres list_types, cela n'a pas d'importance s'il y a des doublons. – harmanjd

+1

ho, à droite. Ensuite, je ne connais pas de moyen de le faire dans MySQL, puisque CHECK constaint n'est pas encore supporté par les moteurs de stockage: http://forums.mysql.com/read.php?136,152474,240479#msg-240479. Mais, comme codymanix dit, je préfère modifier la structure de données si l'application de cette règle dans la base de données est essentielle. –

0

Je supposé que vous auriez à écrire un déclencheur pour vérifier cela.

0

Je n'utilise MySQL, mais peut-être vous pouvez créer un index comme celui-ci:

CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END)); 

Explication: Un index unique ne doit pas se soucier de valeurs NULL. Par conséquent, assurez-vous que l'expression d'index renvoie NULL pour chaque ligne où list_type <> 'default'.

+0

Ressemble à ce que nous avons fait pour oracle (avec un décodage).Mais voici ce que j'ai eu en l'essayant: mysql> CREER UNIQUE INDEX list $ default $ uk ON list_group ((CAS WHEN list_type = 'default' THEN NULL ELSE visitor_uid END)); ERREUR 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '(CASE WHEN list_type =' par défaut 'THEN NULL ELSE visitor_uid END))' à la ligne 1 mysql> – harmanjd

0

Mes deux cents:

pourquoi ne pas créer une seule colonne pour stocker la valeur unique (peut-être vous pouvez l'appeler quelque chose comme is_list_type_default) et un autre pour stocker toutes les valeurs. Si vous faites cela, vous pouvez mettre une contrainte unique sur la première colonne.

Questions connexes