我想在整个数据库中进行查找和替换而不仅仅是表格。
如何更改下面的脚本才能正常工作?
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]');
答案 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)
非常有用的基于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)
为什么呢?
因为您的数据库很可能包含序列化数据(尤其是 wp_options 表),因此仅使用“替换”可能会破坏数据。
使用推荐的序列化: https://www.protectpages.com/tools/WordpressMigrator
答案 8 :(得分:1)
如果您在phpMyAdmin中并且只进行了微小的更改,则可以轻松完成此操作。
您始终可以选择所有表格或任何表格。请记住提供搜索关键字,它将用作通配符(%)。
现在您可以逐个打开每个表并执行更新 生成的示例查询可能如下所示。
SELECT * FROM sibeecst_passion
。wp_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)
答案 11 :(得分:0)
我只是想分享一下如何使用sql数据库查找/替换内容,因为我需要替换Chrome的sessionbuddy db文件中的链接。