更改数据库中的值,其中更新的值可能与旧值冲突

时间:2013-06-26 07:05:08

标签: mysql sql-update

我需要更新表中所有行的作者ID(它恰好是WordPress wp_posts表中的作者)。

如果我想更改作者ID 1 - > 10我可以这样做: -

UPDATE wp_posts SET post_author = 10 WHERE post_author = 1;

(注意 - 实际上我会使用$ wpdb类,但这是基础SQL,而用户ID只是示例 - 我无法假设实际的内容ID将是)。

该更新工作正常。但是,如果在原始数据集中我已经有一个作者ID = 10,并且我需要将该作者更新为ID = 20,那么我遇到了麻烦 - 我已经将所有ID = 1更改为ID = 10,所以再次进行相同的更新会为所有最初有作者ID = 10且ID = 1的帖子设置ID = 20.

我可以使用一组临时ID来解决问题,例如: -

UPDATE wp_posts SET post_author = 90010 WHERE post_author = 1;
UPDATE wp_posts SET post_author = 90020 WHERE post_author = 10;
UPDATE wp_posts SET post_author = 10 WHERE post_author = 90010;
UPDATE wp_posts SET post_author = 20 WHERE post_author = 90020;

但这感觉很难看,虽然我可能安全地为临时值选择一些适当的高范围,但我真的应该检查它们是否先存在,这使得整个过程更加复杂。

周围有更优雅的方式吗?

1 个答案:

答案 0 :(得分:0)

既然你已经声明用户ID可以是任何,那么我认为这样做的优雅方式是:

  1. 创建虚拟列(如dummyUserID_userIdpreviousUserId)。当然,无论你想要什么。

  2. userId更新为新添加的列

    UPDATE wp_posts SET old_post_author = post_author;

  3. 那就是诀窍,使用新添加的专栏做UPDATE

    UPDATE wp_posts SET post_author = 90010 WHERE old_post_author = 1;

    UPDATE wp_posts SET post_author = 90020 WHERE old_post_author = 10;

    UPDATE wp_posts SET post_author = 10 WHERE old_post_author = 90010;

    UPDATE wp_posts SET post_author = 20 WHERE old_post_author = 90020;