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

Mysql 更改数据库中的值,其中更新的值可能与旧值冲突,mysql,sql-update,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(恰好是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;
但这感觉很难看,虽然我可能可以安全地为临时值选择一些合适的高范围,但我确实应该首先检查它们不存在,这使得整个过程更加复杂


有没有更优雅的方法来解决这个问题?

既然你说用户ID可以是任何东西,那么我认为最优雅的方法是:

  • 创建一个伪列(如
    dummyUserID
    \u userId
    previousUserId
    )。当然,随你的便

  • userId
    更新到添加的新列

    更新wp\u posts SET old\u post\u author=post\u author

  • 这就是诀窍,使用新添加的列进行
    更新

    更新wp_posts SET post_author=90010,其中old_post_author=1

    更新wp_posts SET post_author=90020,其中old_post_author=10

    updatewp\u posts SET post\u author=10,其中old\u post\u author=90010

    更新wp_posts SET post_author=20,其中old_post_author=90020


  • 你有把1改为10和10改为20的依据吗?背后的逻辑是什么?不,这些只是示例-在实际情况中,用户ID可以是任何东西。添加一个虚拟列当然有一个优点,即不需要将ID更改为临时值(因此在您的代码中,我可以直接转到例如
    post_author=10,其中old_post_author=1
    ),但是仅仅为了一次操作而向表中添加一列仍然感觉不到特别优雅。。。尽管我可以在之后立即删除该列,因此没有持久的效果。好吧,我想不出其他方法,因为
    用户ID可以是任何东西。不会有计算需要解决。