首页 > 解决方案 > 使用查询更新 mysql 数据库文本

问题描述

我们目前有一个数据库,多年来存储了超过 100,000 条数据记录,但其结构不再有效。

表中有一个名为 youtube_video 的字段

它一直在存储所有嵌入的 YouTube 视频,如下所示:

http://www.youtube.com/embed/3mHuu5NklOs?rel=0
http://www.youtube.com/embed/3mHuu5NklOs

我们需要将其更改为:

https://www.youtube.com/watch?v=3mHuu5NklOs

有没有办法编写一个查询,通过单个查询进行此更改?

标签: mysqlsqldatabase

解决方案


您可以使用 REGEXP_REPLACE :

SELECT REGEXP_REPLACE(
    youtube_video,
    '^http://www.youtube.com/embed/([^?]+).*',
    'https://www.youtube.com/watch?v=\1'
) FROM mytable 

正则表达式分解:

  • ^: 字符串的开始
  • http://www.youtube.com/embed/: 常量字符串部分
  • ([^?]+): 尽可能多的连续字符,而不是问号;周围的括号捕获字符串的该部分,并使其\1在第二个参数中可用REGEXP_REPLACE()
  • .*: 任何东西(直到字符串结束)

DB Fiddle 上的这个演示返回:

| Youtube 视频 | new_youtube_video |
| ---------------------------------------------- | ------------------------------------------------------- |
| http://www.youtube.com/embed/3mHuu5NklOs?rel=0 | https://www.youtube.com/watch?v=3mHuu5NklOs |
| http://www.youtube.com/embed/3mHuu5NklOs | https://www.youtube.com/watch?v=3mHuu5NklOs |

如果需要,您可以轻松地将其转换为UPDATE

UPDATE mytable
SET youtube_video = REGEXP_REPLACE(
    youtube_video,
    '^http://www.youtube.com/embed/([^?]+).*',
    'https://www.youtube.com/watch?v=\1'
);

推荐阅读