2011-08-20 5 views
0

J'essaie de faire une mise à jour dans la table MySql - en migrant simplement les données d'un utilisateur vers un autre utilisateur. La ligne concrète doit être migrée uniquement lorsque la ligne avec le même ID unique devid n'existe pas encore pour ce second utilisateur.Mettre à jour la table MySql - tester l'unicité d'un champ pendant la mise à jour

La déclaration de mise à jour que j'ai utilisé est:

update userdata as userdata1 set userid=${newuser} 
where 
    userid=${olduser} and 
    userdata1.devid != 
    (select devid from userdata as userdata2 
    where 
     userdata2.userid = ${newuser} and userdata2.`devid` = userdata1.`devid`) 

Le MySql retourne:

You can't specify target table 'userdata' for update in FROM clause 

Mais de l'autre côté, les travaux de l'instruction SELECT similaires, ou de la déclaration de mise à jour similaire, lorsque je teste des données sur un autre, cette même table fonctionne également. Donc c'est une limitation, qu'il n'est pas possible de faire sur la même table lors de la mise à jour? Et comment gérer cela?

Merci,

Jindrich

+0

Wouldn'ta 'UNIQUE key' plutôt utile? – glglgl

+0

J'ai une contrainte UNIQUE KEY, mais cela empêche seulement de ne pas avoir le même DEVID plus d'une fois, mais j'ai besoin de gérer la mise à jour pour ne pas essayer, car toute la requête va échouer avec violation de contrainte. – sarsonj

Répondre

0

Vous pouvez utiliser une jointure gauche:

UPDATE userdata u1 
LEFT JOIN userdata u2 ON u2.userid = :newuser AND u2.devid = u1.devid 
SET u1.userid = :newuser 
WHERE u1.userid = :olduser 
    AND u2.userid IS NULL; 
+0

(pardonnez mon utilisation agressive passive des espaces réservés.Je ne peux pas me résoudre à utiliser des chaînes PHP). –

+0

Merci, cela aide! – sarsonj

Questions connexes