我正在将 mysql 中的评论数据从一个数据库导入到另一个数据库,其中某些数据可能已经存在。与此相关的是,我们的 comments
表有一个 text
类型的 display_text
列。在本列中,我们提到了以“@{{"user":id}}@
”格式存储的其他用户,其中 id 是表示另一个表中用户 ID 的数字。一条评论可能有多个提及,也需要更新 ID。
由于这些用户可能已存在于新数据库中,因此我们导入过程的一部分会使用 old_id
和 new_id
列映射填充 id_translations
表将源数据库中的用户 ID 更改为新数据库中的用户 ID。是否可以编写一条 mysql UPDATE 语句来查找我们提及的格式,并仅用新 id 替换 id ?
我已经有一种方法可以只选择需要更新 id 的评论,因此可以像更新整个表一样编写语句。
MySQL 版本 5.6。这是我的表格的示例。CREATE TABLE IF NOT EXISTS `comments` (
`id` int(6) unsigned NOT NULL,
`display_text` text NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `id_translations` (
`old_id` int(6) unsigned NOT NULL,
`new_id` int(6) unsigned NOT NULL,
PRIMARY KEY (`old_id`, `new_id`)
);
INSERT INTO `comments` (`id`, `display_text`) VALUES
(1, 'Hey @{{"user":12}}@, look at this'),
(2, 'Thats pretty cool'),
(3, '@{{"user":41}}@ could you take a peek at this?');
INSERT INTO `id_translations` (old_id, new_id) VALUES (12, 100), (41, 101);
我们的目标是让评论看起来像这样:
1, 'Hey @{{"user":100}}@, look at this'
2, 'Thats pretty cool'
3, '@{{"user":101}}@ could you take a peek at this?'
最佳答案
CREATE PROCEDURE replacing ()
BEGIN
REPEAT
UPDATE comments
SET display_text = CONCAT( LEFT(display_text, LOCATE('@{{"user":', display_text) - 1),
CHAR(0),
( SELECT new_id
FROM id_translations
WHERE old_id = 0 + SUBSTRING(display_text FROM LOCATE('@{{"user":', display_text) + 10)),
CHAR(1),
SUBSTRING(display_text FROM LOCATE('}}@', display_text) + 3))
WHERE LOCATE('@{{"user":', display_text);
UNTIL !ROW_COUNT() END REPEAT;
UPDATE comments
SET display_text = REPLACE(REPLACE(display_text, CHAR(0), '@{{"user":'), CHAR(1), '}}@');
END
关于mysql - mysql 是否可以动态翻译存储在字符串中的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361971/