sql命令update更新replace替换一个字段的多条记录

admin
admin
admin
343
文章
75
评论
2022年2月27日11:20:13
评论
68

需要解决的问题:

WordPress程序中wp_posts表里面的post_content字段中的百度网盘链接需要一一进行替换。

我们知道,如果单个的更新替换的话我们用以下命令:

update wp_posts set post_content = replace(post_content,old_content,new_content)

但我们现在需要替换的记录几百条,甚至几千条的时候执行上述命令显然有些不切实际,当然你也可以将上述命令在代码编辑器里面通过列模式批量将每个替换命令写出来,不过我们还有更简洁的代码来满足上述要求:

首先,我们需要在数据库里面创建一个表wp_temp,里面将老的链接和新的链接一一对应,做成两列,分别为old_content和new_content。

create table wp_temp (old_content longtext,new_content longtext)

我们可以将新链接和老链接事先在本地电脑通过excel一一对应的做好,然后另存为csv格式,然后将csv格式的文件用代码编辑器打开,转为uft-8的编码格式。接着将csv文件导入到表wp_temp里面即可。

接着执行下面的sql命令,创建一个临时的表tmp

create table tmp as
select post_content, content_new_r
         from (select a.post_content,
                      replace(a.post_content,
                              b.old_content,
                              b.new_content) as content_new_r
                 from wp_posts a, wp_temp b) tmp
        where tmp.post_content <> tmp.content_new_r
		

如果数据比较多,执行上面命令会有点慢,我们等一会就好了。

如果wp_posts里面的数据较多的话有可能会出错,品自行因为这个问题就遇到了以下错误:

#126 - Incorrect key file for table '/tmp/#sql_1697_0.MYI'; try to repair it

这时我们最好是将wp_posts里面的内容根据分类id将同一分类的记录创建到新的表wp_content,然后针对新表执行上述命令,先执行下面的命令,wp_term_relationships.term_taxonomy_id = 11这个是分类id的值。

请不要用SELECT * INTO FROM语句在mysql里面执行以下命令,否则会出错的。

CREATE table wp_content 
select post_content from wp_posts,wp_term_relationships,wp_term_taxonomy 
where ID=object_id 
and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
and post_type="post" 
and post_status = "publish" 
and wp_term_relationships.term_taxonomy_id = 11 
and taxonomy = "category"

接着执行上一步的sql命令,不过要将wp_posts改为wp_content:

create table tmp as
select post_content, content_new_r
         from (select a.post_content,
                      replace(a.post_content,
                              b.old_content,
                              b.new_content) as content_new_r
                 from wp_content a, wp_temp b) tmp
        where tmp.post_content <> tmp.content_new_r

运行完毕后,会在我们的数据库里面创建一个表tmp,里面有post_content和content_new_r两个字段,前者是wp_posts里面的post_content复制过来的,后者是已经将post_content里面的链接替换号以后的内容。这个时候这个表里面每条记录都没有编辑选项,可以增加一个自增主键,方能进行编辑,能够完整的查看post_content和content_new_r两个字段内容的对比。

接着我们用新的content_new_r来替换wp_posts里面的post_content即可。

update wp_posts sr
   set sr.post_content =
       (select tmp.content_new_r
          from tmp
         where tmp.post_content = sr.post_content)
 where exists (select 1 from tmp where tmp.post_content = sr.post_content);

最后,我们可以在前端随机查看几个网页,看是否更改成功,并在数据库后台搜索百度网盘的特征字符,看是否有未进行替换的,如果有个别的未替换成功的话手动更改一下即可。

admin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: