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 !