2012-07-26 85 views
0

什么是在MySQL中查找替换整个数据库的最佳方式,而无需真正以语言编写脚本(我的意思是,如果这就是必须完成的任务,那么做吧) 。在MySQL中查找/替换

基本上我想用Drupal中的另一个站点名称(我正在设置一个用于升级的开发服务器)替换一个站点名称。

我的想法是数据库中的所有链接都需要更改。我宁愿使用PHPMyAdmin来做到这一点,但我也很乐意使用命令行。

+1

您是在试图在单个表格/列中查找/替换,还是要在整个数据库中搜索有史以来的表/列? – newfurniturey 2012-07-26 14:34:41

+0

整个数据库中的每个表/列。 – 2012-07-26 15:04:54

回答

1

假设你有一个表的设置,如:

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查询中的列类型,或者如果知道替换可能发生的确切列名称(但是我想你不需要执行查找+替换),那么这可以变得更高效。