2011-05-18 6 views
2

J'ai une table MySQL avec, entre autres, deux champs: a (int) et b (string) utilisant le moteur InnoDB. Je souhaite le structurer de sorte qu'une valeur particulière de b puisse apparaître un nombre arbitraire de fois dans la table mais chaque fois qu'elle apparaît, elle doit toujours apparaître avec la même valeur de a, c'est-à-dire que ma table ressemble à ceci:Contrainte MySQL

(a,b) 
(1,'foo') 
(2,'bar') 
(2,'bar') 
(2,'baz') 

je devrais être en mesure d'insérer avec succès (1, 'foo'), (2, 'bar') ou même (2, 'qux') dans la table, mais inserts (2, 'foo '), (1,' bar ') ou (1,' baz ') devraient échouer parce que chaque fois que les valeurs de chaîne de b apparaissent, elles devraient toujours apparaître avec la même valeur de a.

Des idées pour le faire efficacement? J'ai joué avec des transactions et SELECT ... FOR UPDATE mais pas de chance. Est-ce que j'ai la mauvaise structure de la table?

+0

Peut-être créer une table qui a quelles valeurs doivent être avec quelles ints? – AllisonC

Répondre

1

Je fini par utiliser une déclaration comme:

INSERT INTO mytable(`a`,`b`) SELECT 1,'foo' FROM dual WHERE NOT EXISTS 
(SELECT * FROM mytable WHERE a != 1 AND b = 'foo') 

Ce qui ne va insérer une ligne si le retour de select imbriquées aucune ligne.

0

Qu'en est-somthing comme

si elle existe (sélectionnez null de matable a = prm_a et b = prm_b!) Puis insérer dans ... autre raise fin;

?

Questions connexes