清理多个编号的mysql表[关闭]

Posted

技术标签:

【中文标题】清理多个编号的mysql表[关闭]【英文标题】:Clean multiple numbered mysql tables [closed] 【发布时间】:2019-08-06 23:49:42 【问题描述】:

我必须更新几个表来清理 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 没有任何积极的结果。 (我不习惯直接使用 DB)。

我将执行的查询如下所示:

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

谢谢。

【问题讨论】:

现在您会发现为什么使用元数据将“大”表分成较小的表是一种您不应该使用的 SQL 反模式。 这不是我所做的,是 Wordpress 所做的@RaymondNijland “这不是我做的,是 Wordpress 做的” 很公平,现在你知道 Wordpress 做错了 为什么这么讨厌男人?当我的问题有效时,您也投了反对票@RaymondNijland “当我的问题有效时,你也投了反对票” 我没有投反对票,你也没有办法说出来。 “为什么这么讨厌男人?” 我只是不喜欢 Wordpress 编码/引擎/解决方案,这是它不是个人的原因之一。“我想知道是否有是我可以用来替换该博客 ID 号的任何通配符,因此它将一次将所有表格从 1 到 x 号。” 不,您将必须编写 500+ 加上分离的UPDATE 查询 【参考方案1】:

基本上,您正在寻找动态 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 接受的答案彻底解释了这两种方法的逻辑,尤其是存储过程解决方案。

【讨论】:

太棒了!!!!谢谢!

以上是关于清理多个编号的mysql表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL加入来自同一个表的多个列[关闭]

清理多个不可关闭资源时减少嵌套

mysql 权限设置

将数据插入多个 1:1 表,其中主表具有自动编号

MySQL分区表简介

随笔编号-16 MySQL查看表及索引大小方法