ukulele fr en coulisses

les rouages techniques de ukulele.fr

UPDATE … ON DUPLICATE DELETE juillet 29, 2009

Filed under: MySQL — bertrand - kdus @ 11:37
Tags: , ,

non ce que vous lisez ci dessus n’existe pas dans MySQL, mais je me suis posé la question et si vous lisez ces lignes peut-être que vous aussi. Il s’agit de remplacer dans une table d’associations many to many un membre de l’association par un autre de même nature (pour simplifier, si j’ai la table a, la table b et la table ab d’associations, je veux remplacer un id de la table a dans ab par un autre id de la table a). Problème bien sûr, j’ai une clause unique sur (ida,idb) dans ab, donc mon UPDATE peut me balancer des erreurs si l’associaton que j’essaie de mettre à jour devient une association qui existe déjà.

Problème résolu en deux requêtes au lien d’une avec un UPDATE IGNORE suivi d’un DELETE sur le ida remplacé dans ab.

en résumé :

a:

+------------+
+ id | value |
+----+-------|
| 1  | abc   |
| 2  | def   |
| 3  | ghi   |
+----+-------+
b:
+------------+
+ id | value |
+----+-------|
| 1  | pip   |
| 2  | xzu   |
| 3  | mni   |
+----+-------+

et l’association ab

+---+---+---+
|id |ida|idb|
+---+---+---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 3 |
| 5 | 3 | 2 |
| 6 | 3 | 3 |
+---+---+---+ UNIQUE(ida,idb)

Si je veux remplacer les ida 2 de ab par 1, je fais

UPDATE ab SET ida=’1′ WHERE ida=’2′

mais MySQL va me renvoyer à la gueule que j’ai la clause unique rapport par exemple à la ligne 3. Ce que je voudrais faire c’est

UPDATE ab SET ida=’1′ WHERE ida=’2′ ON DUPLICATE DELETE

qui n’existe pas donc

UPDATE IGNORE ab SET ida=’1′ WHERE ida=’2′

bon ignore c’est pas du tout clean ok… suivi de

DELETE FROM ab WHERE ida=’2′

car les ida=’2′ qui restent sont forcément des duplicata.

Trivial, oui sans doute, mais bon ça fera peut-être gagner 10 mn à quelqu’un !

 

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

 
Suivre

Get every new post delivered to your Inbox.