0

在 MySQL 中查找替换整个数据库的最佳方法是什么,而不必用一种语言实际编写脚本(我的意思是,如果必须这样做,那就这样吧)。

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

我的想法是数据库中的所有链接都需要更改。我更喜欢使用 PHPMyAdmin 来执行此操作,但我也很乐意使用命令行。

4

1 回答 1

1

假设您有一个表设置,例如:

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(但我想您不需要进行查找+替换。

于 2012-07-26T14:28:09.783 回答