查找并替换整个mysql数据库

时间:2011-01-27 22:23:44

标签: mysql

我想在整个数据库中进行查找和替换而不仅仅是表格。

如何更改下面的脚本才能正常工作?

 update [table_name] set [field_name] = replace([field_name],'[string_to_find]','[string_to_replace]');

我只使用星号吗?

 update * set [field_name] = replace([field_name],'[string_to_find]','[string_to_replace]');

12 个答案:

答案 0 :(得分:121)

sqldump到文本文件,查找/替换,重新导入sqldump。

将数据库转储到文本文件
mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

对数据库进行更改后还原数据库。
mysql -u root -p[root_password] [database_name] < dumpfilename.sql

答案 1 :(得分:37)

在word-press mysql查询中将旧URL更新为新URL:

UPDATE wp_options SET option_value = replace(option_value, 'http://olddomain.com', 'http://newdomain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://olddomain.com','http://newdomain.com');

UPDATE wp_posts SET post_content = replace(post_content, 'http://olddomain.com', 'http://newdomain.com');

UPDATE wp_posts SET post_excerpt = replace(post_excerpt, 'http://olddomain.com', 'http://newdomain.com');

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'http://olddomain.com', 'http://newdomain.com');

答案 2 :(得分:5)

这强烈暗示您的数据在开始时尚未标准化。

这样的事情应该有效(注意,你没有提到你使用过任何其他语言 - 所以它写成了MySQL存储过程)

 create procedure replace_all(find varchar(255), 
        replce varchar(255), 
        indb varcv=char(255))
 DECLARE loopdone INTEGER DEFAULT 0;
 DECLARE currtable varchar(100);
 DECLARE alltables CURSOR FOR SELECT t.tablename, c.column_name 
    FROM information_schema.tables t,
    information_schema.columns c
    WHERE t.table_schema=indb
    AND c.table_schema=indb
    AND t.table_name=c.table_name;

 DECLARE CONTINUE HANDLER FOR NOT FOUND
     SET loopdone = 1;

 OPEN alltables;

 tableloop: LOOP
    FETCH alltables INTO currtable, currcol; 
    IF (loopdone>0) THEN LEAVE LOOP;
    END IF;
         SET stmt=CONCAT('UPDATE ', 
                  indb, '.', currtable, ' SET ',
                  currcol, ' = word_sub(\'', find, 
                  '\','\'', replce, '\') WHERE ',
                  currcol, ' LIKE \'%', find, '%\'');
         PREPARE s1 FROM stmt;
         EXECUTE s1;
         DEALLOCATE PREPARE s1;
     END LOOP;
 END //

我会留给你研究如何声明word_sub函数。

答案 3 :(得分:4)

简短的回答:你不能。

答案很长:您可以使用INFORMATION_SCHEMA来获取表定义,并使用它来动态生成必要的UPDATE语句。例如,你可以从这开始:

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_schema'

尽管如此,我会尽量避免这样做。

答案 4 :(得分:2)

MySQL Search & Replace Tool

非常有用的基于Web的工具,用PHP编写,可以轻松搜索和替换MySQL数据库中的文本字符串。

答案 5 :(得分:1)

这是不可能的 - 您需要单独为每个表执行UPDATE。

警告:DUBIOUS,但它可以工作(可能)解决方案

或者,您可以通过mysqldump转储数据库,只需在生成的SQL文件上执行搜索/替换。 (我建议在这个过程中使用--add-drop-table和--extended-insert标志来删除任何可能触及数据库的内容。)但是,你需要确保搜索/替换文本不会改变除数据本身以外的任何内容(即:您要替换的文本可能不会作为SQL语法的一部分出现)和我真的会尝试重做 - 首先插入一个空的测试数据库。)

答案 6 :(得分:1)

简单解决方案

UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

答案 7 :(得分:1)

用REPLACE命令替换时要小心!

为什么呢?

因为您的数据库很可能包含序列化数据(尤其是 wp_options 表),因此仅使用“替换”可能会破坏数据。

使用推荐的序列化: https://www.protectpages.com/tools/WordpressMigrator

答案 8 :(得分:1)

如果您在phpMyAdmin中并且只进行了微小的更改,则可以轻松完成此操作。

  • 登录您的phpMyAdmin
  • 选择执行更改所需的数据库
  • 点击搜索选项

    enter image description here

您始终可以选择所有表格或任何表格。请记住提供搜索关键字,它将用作通配符(%)。

  • 现在点击Go。
  • 这将为您提供包含您所拥有物品的所有表格 搜索。

enter image description here

  • 现在您可以逐个打开每个表并执行更新 生成的示例查询可能如下所示。

    SELECT * FROM sibeecst_passionwp_ewwwio_images WHERE(CONVERT(id使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(path使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(image_md5使用utf8)LIKE&#39;%sibee%&#39;或转换(results使用utf8)LIKE& #39;%sibee%&#39; OR CONVERT(gallery使用utf8)LIKE&#39;%sibee%&#39;或转换(image_size使用utf8)LIKE&#39;% sibee%&#39; OR CONVERT(orig_size使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(updates使用utf8)LIKE&#39;%sibee%&# 39;或转换(updated使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(trace使用utf8)LIKE&#39;%sibee%&#39;或CONVERT (attachment_id使用utf8)LIKE&#39;%sibee%&#39;或转换(resize使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT({{1使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(converted使用utf8)LIKE&#39;%sibee%&#39; OR CONVERT(level使用utf8 )LIKE&#39;%sibee%&#39; OR CONVERT(pending使用utf8)LIKE&#39;%sibee%&#39;)

答案 9 :(得分:1)

我在MySQL上遇到了同样的问题。我从symcbean那里接受了该程序,并使她适应了我的需要。

我只会替换文本值(或您在SELECT FROM information_schema中输入的任何类型),因此,如果您具有日期字段,则执行时不会出错。

在SET @stmt中注意排序规则,它必须与您的数据库排序规则匹配。

我在具有多个替换的变量中使用了模板请求,但是如果您有动力,则可以使用一个CONCAT()来完成。

无论如何,如果数据库中已序列化数据,请不要使用它。除非您用长度相同的字符串替换字符串,否则它将不起作用。

希望它对某人有帮助。

DELIMITER $$

DROP PROCEDURE IF EXISTS replace_all_occurences_in_database$$
CREATE PROCEDURE replace_all_occurences_in_database (find_string varchar(255), replace_string varchar(255))
BEGIN
  DECLARE loop_done integer DEFAULT 0;
  DECLARE current_table varchar(255);
  DECLARE current_column varchar(255);
  DECLARE all_columns CURSOR FOR
  SELECT
    t.table_name,
    c.column_name
  FROM information_schema.tables t,
       information_schema.columns c
  WHERE t.table_schema = DATABASE()
  AND c.table_schema = DATABASE()
  AND t.table_name = c.table_name
  AND c.DATA_TYPE IN('varchar', 'text', 'longtext');

  DECLARE CONTINUE HANDLER FOR NOT FOUND
  SET loop_done = 1;

  OPEN all_columns;

table_loop:
LOOP
  FETCH all_columns INTO current_table, current_column;
  IF (loop_done > 0) THEN
    LEAVE table_loop;
  END IF;
  SET @stmt = 'UPDATE `|table|` SET `|column|` = REPLACE(`|column|`, "|find|", "|replace|") WHERE `|column|` LIKE "%|find|%"' COLLATE `utf8mb4_unicode_ci`;
  SET @stmt = REPLACE(@stmt, '|table|', current_table);
  SET @stmt = REPLACE(@stmt, '|column|', current_column);
  SET @stmt = REPLACE(@stmt, '|find|', find_string);
  SET @stmt = REPLACE(@stmt, '|replace|', replace_string);
  PREPARE s1 FROM @stmt;
  EXECUTE s1;
  DEALLOCATE PREPARE s1;
END LOOP;
END
$$

DELIMITER ;

答案 10 :(得分:0)

另一种选择(取决于用例)将使用DataMystic的TextPipeDataPipe产品。我过去曾经使用它们,并且它们在复杂的替换场景中运行良好,无需将数据导出数据库以进行查找和替换。

答案 11 :(得分:0)

我只是想分享一下如何使用sql数据库查找/替换内容,因为我需要替换Chrome的sessionbuddy db文件中的链接。

  • 所以我使用 SQLite将sql数据库文件导出为.txt文件 数据库浏览器2.0 b1
  • 在notepad ++中查找/替换
  • 将.txt文件重新导入 SQLite数据库浏览器2.0 b1