根据包含原始字符串及其各自替换的表,搜索并替换 MariaDB 数据库中所有表的文本字段中的字符串

问题描述 投票:0回答:1

我有一个大型数据库,其中有几个具有不同文本字段变体的表(VARCHAR、LONGTEXT、MEDIUMTEXT 等)。

在这些文本字段中有时会有指向 Vimeo 上视频的链接。他们指出的几乎所有视频都已转移到 YouTube。几乎是这里的关键。

我有一个所有移动视频的查找表,其中包含三列:“id”(INT)、“old_url”(VARCHAR)和“new_url”(VARCHAR)。

我想要做的是选择第一个“old_url”,在数据库中所有表中的所有文本字段中搜索该特定的 url,并将其替换为同一行上“new_url”中的任何内容。然后我想选择下一个“old_url”并执行相同的操作并继续查找整个查找表(有 2667 行,所以我不想手动逐一执行此操作)。

我的问题是,需要查找和替换的网址位于文本深处,并且其中一些网址出现多次,甚至在同一字段中,并且每个实例都需要替换。

我尝试创建一个存储过程来执行此操作,但惨败。要么它什么都不做,要么我收到一条错误消息。这是我最新的尝试,我知道它不起作用,但我不知道为什么。 (我绝对不是 SQL 专家)

DELIMITER //

CREATE PROCEDURE update_urls()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE table_name VARCHAR(255);
    DECLARE column_name VARCHAR(255);
    DECLARE cur CURSOR FOR 
        SELECT TABLE_NAME, COLUMN_NAME 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_SCHEMA = DATABASE() 
        AND DATA_TYPE IN ('VARCHAR', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO table_name, column_name;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET @sql = CONCAT('UPDATE ', table_name, ' t ',
                          'JOIN url_mapping m ',
                          'SET t.', column_name, ' = REPLACE(t.', column_name, ', m.old_url, m.new_url) ',
                          'WHERE t.', column_name, ' LIKE CONCAT(''%'', m.old_url, ''%'')');
        
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;

    CLOSE cur;
END //

DELIMITER ;

我真的很感激任何我能得到的帮助......

string stored-procedures replace mariadb
1个回答
0
投票

我们建议忘记存储过程,只编写一个执行任务的脚本。逻辑非常简单,与您提到的相同。

  1. 连接数据库

  2. 查找具有所需类型字段的表

    a.每桌都做

    i. For every row in the lookup table do
    
       1. retrieve old_url
       2. retrieve new_url
       3. retrieve the content of column that contains string
       4. use regular expressions to match old_url and replace with new_url
       5. update the table when url has changed
    

如果您决定使用 Python 或任何其他编程语言,您会发现通过正则表达式处理字符串比尝试使用 SQL 来处理字符串要容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.