2009-08-07 7 views
2

Disons que vous aviez une table comme ceci:Passer des valeurs entre les lignes dans la colonne unique,

id | name 
---+--------- 
1 | foo 
2 | bar 

Il y a une contrainte d'unicité sur la colonne name.

Comment voulez-vous mettre la ligne avec id=2 à foo, et la ligne avec id=1-bar?

Je sais que vous pourriez probablement juste attribuer des noms temporaires aux deux, puis coller dans les noms souhaités, mais cela ne semble pas être le moyen le plus simple. J'utilise Hibernate, donc toutes les astuces spécifiques à Hibernate seraient sympas. Cela semble cependant être un problème qui affecte tous les SGBDR en général.

+2

Je ne peux pas empêcher de se demander pourquoi vous aurait besoin de quelque chose comme ça, cependant. Essayez-vous de maintenir une sorte de liste ordonnée? Si c'est le cas, il vaut mieux ajouter une colonne "element_index" séparée. Pouvez-vous expliquer ce que vous essayez de faire? – ChssPly76

+0

Quels SGBD utilisez-vous? –

Répondre

5

Dans Sql Server, vous pouvez les mettre à jour les deux en même temps:

UPDATE table 
SET Name = CASE WHEN ID = 1 THEN 'bar' ELSE 'foo' END 
WHERE ID IN (1, 2) 
+0

+1, je ne pensais pas que cela fonctionnerait, mais je l'ai essayé (créé une table, une contrainte, etc) et cela fonctionne –

4

En SQL Server et Oracle, les contraintes sont reportés, c'est la raison pour laquelle vous émettez simplement cette requête:

UPDATE mytable 
SET  name = CASE name WHEN 'foo' THEN 'bar' ELSE 'foo' END 
WHERE name IN ('foo', 'bar') 

Comme suggéré dans les commentaires, il semble que vous utilisiez ceci dans MySQL pour maintenir une liste ordonnée (c'était la dernière fois que j'ai rencontré ce problème).

Dans ce cas, vous pouvez lire la série d'articles dans mon blog sur la façon de le faire en MySQL plus efficacement:

+0

+1. Hibernate supporte l'instruction CASE dans HQL: http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-expressions – ChssPly76

Questions connexes