在MySQL中查找/替换

时间:2012-07-26 14:25:41

标签: mysql

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

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

我的想法是需要更改数据库中的所有链接。我更愿意使用PHPMyAdmin来做到这一点,但我也很高兴使用命令行。

1 个答案:

答案 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查询中的列类型,或者如果您知道替换可以发生的确切列名称,则可以提高效率(但我猜您不需要进行查找) +取代。