2012-07-26 103 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查詢中的列類型,或者如果知道替換可能發生的確切列名稱(但是我想你不需要執行查找+替換),那麼這可以變得更高效。