Mysql 更改数据库中的值,其中更新的值可能与旧值冲突
我需要更新表中所有行的作者ID(恰好是WordPress wp_posts表中的作者) 如果我想更改作者ID 1->10,我可以使用:-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,那么我会遇到麻烦-我已经
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可以是任何东西。不会有计算需要解决。