2011-08-20 30 views
0

我想在MySql表中更新语句 - 只是将数据从一个用户迁移到第二个用户。只有具有相同唯一ID devid的行尚未存在时,才应该迁移具体行。更新MySql表 - 在更新过程中测试一个字段的唯一性

,我使用的更新语句是:

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`) 

MySQL的返回:

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

但是从另一种方式,类似的SELECT语句的作品,或类似的更新语句,当我测试数据在另一张同样的桌子上工作。那么这是一些限制,在更新期间不可能在同一张桌面上进行选择?以及如何管理这个?

感谢,

英德日赫

+0

难道一个'UNIQUE KEY'是相当有帮助吗? – glglgl

+0

我有UNIQUE KEY约束,但是这只防止不会发生多次具有相同的DEVID,但是我需要管理更新而不尝试这样做,因为整个查询将随着违反约束而失败。 – sarsonj

回答

0

您可以使用左连接:

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

(原谅我被动地使用占位符,不能让自己使用PHP字符串)。 –

+0

谢谢,这有助于! – sarsonj