清理多个编号的mysql表

时间:2019-03-15 20:41:19

标签: mysql sql wordpress phpmyadmin cron

我必须更新几张表以清理wordpress多站点安装中堆积的cron作业。

该网络有500多个站点,并且wordpress中的表已编号,因此您将拥有:

wp_options
wp_1_options // for blog id 1
wp_2_options
wp_3_options
// and so on...

我想知道是否可以使用任何通配符替换该博客ID号,以便它一次将所有表从1改为x。我尝试了wp_*_options,没有任何积极的结果。 (我不习惯直接与数据库一起工作。)

我将要执行的查询如下:

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron';

谢谢。

1 个答案:

答案 0 :(得分:2)

基本上,您正在寻找动态SQL:这意味着使用SQL来生成和执行SQL。

在MySQL中,标准方法要求创建一个过程,该过程使用游标遍历表名并生成查询,然后使用prepared statements来执行它们。这可能很棘手。

对于一次操作,我将选择一个中间选项:使用SQL查询生成SQL语句列表。我们可以查询INFORMATION_SCHEMA.TABLES列出要更新的表。

SELECT CONCAT(
    'UPDATE ', table_name, 
    ' SET option_value = NULL',
    ' WHERE option_name = ''cron'';'
) as sql_query
FROM information_schema.tables
WHERE table_name LIKE 'wp_%_options'

然后,剩下要做的就是手动将查询结果复制到首选的MySQL客户端,然后将整个过程作为脚本执行。

NB1:在生产数据库中仔细检查结果并测试查询!

NB2:this SO question的公认答案详尽地解释了两种方法的逻辑,尤其是存储过程解决方案。