在 MySQL 中查找替换整个数据库的最佳方法是什么,而不必用一种语言实际编写脚本(我的意思是,如果必须这样做,那就这样吧)。
基本上我想在 Drupal 中用另一个站点名称(我正在设置用于升级的开发服务器)替换站点名称。
我的想法是数据库中的所有链接都需要更改。我更喜欢使用 PHPMyAdmin 来执行此操作,但我也很乐意使用命令行。
在 MySQL 中查找替换整个数据库的最佳方法是什么,而不必用一种语言实际编写脚本(我的意思是,如果必须这样做,那就这样吧)。
基本上我想在 Drupal 中用另一个站点名称(我正在设置用于升级的开发服务器)替换站点名称。
我的想法是数据库中的所有链接都需要更改。我更喜欢使用 PHPMyAdmin 来执行此操作,但我也很乐意使用命令行。
假设您有一个表设置,例如:
sites
site_id
url
您可以REPLACE()
在UPDATE
命令中使用:
UPDATE sites SET url=REPLACE(url, 'findUrl.com', 'replaceUrl.com');
更新:为了支持在给定数据库中的每个表中的每个列上“查找和替换”的需要,aStored 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
(但我想您不需要进行查找+替换。