在MySQL中查找替换整个数据库的最佳方法是什么,而不必用语言编写实际脚本(我的意思是,如果必须这样做,那就这样吧。)
基本上我想在Drupal中用另一个站点名称替换一个站点名称(我正在为升级设置一个开发服务器)。
我的想法是需要更改数据库中的所有链接。我更愿意使用PHPMyAdmin来做到这一点,但我也很高兴使用命令行。
答案 0 :(得分:1)
假设你有一个表格设置如下:
sites
site_id
url
您可以在UPDATE
命令中使用REPLACE()
:
UPDATE sites SET url=REPLACE(url, 'findUrl.com', 'replaceUrl.com');
更新:为了支持在给定数据库中的每个表中的每个列上“查找和替换”的需要,需要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
查询中的列类型,或者如果您知道替换可以发生的确切列名称,则可以提高效率(但我猜您不需要进行查找) +取代。