0
什么是在MySQL中查找替换整个数据库的最佳方式,而无需真正以语言编写脚本(我的意思是,如果这就是必须完成的任务,那么做吧) 。在MySQL中查找/替换
基本上我想用Drupal中的另一个站点名称(我正在设置一个用于升级的开发服务器)替换一个站点名称。
我的想法是数据库中的所有链接都需要更改。我宁愿使用PHPMyAdmin来做到这一点,但我也很乐意使用命令行。
什么是在MySQL中查找替换整个数据库的最佳方式,而无需真正以语言编写脚本(我的意思是,如果这就是必须完成的任务,那么做吧) 。在MySQL中查找/替换
基本上我想用Drupal中的另一个站点名称(我正在设置一个用于升级的开发服务器)替换一个站点名称。
我的想法是数据库中的所有链接都需要更改。我宁愿使用PHPMyAdmin来做到这一点,但我也很乐意使用命令行。
假设你有一个表的设置,如:
sites
site_id
url
你可以在UPDATE
命令使用REPLACE()
:
UPDATE sites SET url=REPLACE(url, 'findUrl.com', 'replaceUrl.com');
UPDATE:支持,需要 “找到&替换”给定数据库中每个表中的每一列都需要一个Stored Procedure
(当然,如果你想在MySQL中直接使用它)。这里有一个粗略的草稿(未经测试)什么能做到这一点:
DELIMITER $$
CREATE PROCEDURE `find_replace_in_all_tables`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE TABLE_NAME CHAR(255);
DECLARE COLUMN_NAME CHAR(255);
DECLARE tables CURSOR for
SELECT table_name, column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN tables;
WHILE done = 0 DO
FETCH NEXT FROM tables INTO TABLE_NAME, COLUMN_NAME;
IF done = 0 THEN
SET @SQL_TEXT = CONCAT("UPDATE `", TABLE_NAME, "` SET `", COLUMN_NAME, "`=REPLACE(`", COLUMN_NAME, "`, 'findUrl.com', 'replaceUrl.com');");
PREPARE statement FROM @SQL_TEXT;
EXECUTE statement;
DEALLOCATE PREPARE statement;
END IF;
END WHILE;
CLOSE tables;
END
通过information_schema
数据库在当前数据库中每个表/列的存储过程进行迭代。通过这个列表,它构建了一个类似于我的原始答案的UPDATE
查询并执行它。如果限制SELECT
查询中的列类型,或者如果知道替换可能发生的确切列名称(但是我想你不需要执行查找+替换),那么这可以变得更高效。
您是在试图在单个表格/列中查找/替换,还是要在整个数据库中搜索有史以来的表/列? – newfurniturey 2012-07-26 14:34:41
整个数据库中的每个表/列。 – 2012-07-26 15:04:54