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