Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何对从信息_SCHEMA.TABLES中捕获表名的查询结果运行SQL更新?_Mysql_Sql - Fatal编程技术网

Mysql 如何对从信息_SCHEMA.TABLES中捕获表名的查询结果运行SQL更新?

Mysql 如何对从信息_SCHEMA.TABLES中捕获表名的查询结果运行SQL更新?,mysql,sql,Mysql,Sql,我希望在CMS多站点数据库中跨一组公共表替换字符串。以下是收集目标表的初始查询: SELECT TABLE_NAME as target_table FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%_content' …根据结果,我想运行以下程序: UPDATE target_table SET title = replace(title, 'SEARCH_STRING', 'REPLACE_STRING') WHERE title

我希望在CMS多站点数据库中跨一组公共表替换字符串。以下是收集目标表的初始查询:

SELECT TABLE_NAME as target_table
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%_content'
…根据结果,我想运行以下程序:

UPDATE target_table
SET title = replace(title, 'SEARCH_STRING', 'REPLACE_STRING')
WHERE title LIKE ('%SEARCH_STRING%');

提前感谢您的帮助

对于一次性,一种可行的方法是使用SQL生成一组SQL语句

假设table_schem和table_name不包含反勾号字符,并且如果您的SEARCH_字符串和REPLACE_字符串不包含单引号(或正确转义),我们可以执行以下操作:

SELECT CONCAT('UPDATE `',t.table_schema,'`.`',t.table_name,'` c'
       ,' SET c.title = REPLACE(c.title, ''SEARCH_STRING'', ''REPLACE_STRING'')'
       ,' WHERE c.title LIKE (''%SEARCH_STRING%'') ;') AS `-- stmt`
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_name LIKE '%_content'
   AND t.table_schema NOT IN ('information_schema','mysql','performance_schema')
 ORDER BY t.table_schema, t.table_name
我们可以将查询结果保存到文件中。然后将文件中的SQL语句提交到MySQL服务器

(我想我应该使用INFORMATION_SCHEMA.COLUMNS,表中包含名为'title'的列以及与模式匹配的表名,但方法是相同的


请注意,这不能在单个SQL语句中完成;获取表列表的查询必须是一个单独的语句,与实际UPDATE语句的执行分开

编辑我只是看了一下问题中与之相关的答案;这完全不相关。没有任何东西适用于我们试图解决的问题


由于SQL的处理方式(解析、语法检查、语义检查、确定执行计划,然后执行)…标识符(例如表名)必须在SQL文本中作为标记提供。标识符不能在执行时作为值提供。这就是为什么我们需要单独的语句。

您需要在存储过程中使用
PREPARE
EXECUTE
来生成动态SQL。我不明白其他问题是如何相关的。您不能使用
JOIN
来指定表名称,仅用于连接数据。SQL语言禁止您在单个语句中进行连接。您可以用任何语言(包括SQL)汇编“动态SQL语句”,任何您认为合适的方式。但这些将是单独的SQL语句。正如一些人正确指出的,我对另一个stackoverlow解决方案的引用不正确。为了清晰起见,该引用已被删除。谢谢大家!