我有一个大型数据库,其中有几个具有不同文本字段变体的表(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 ;
我真的很感激任何我能得到的帮助......
我们建议忘记存储过程,只编写一个执行任务的脚本。逻辑非常简单,与您提到的相同。
连接数据库
查找具有所需类型字段的表
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 来处理字符串要容易得多。