mysql - 使用查询更新 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
有没有办法编写一个查询,通过单个查询进行此更改?
解决方案
您可以使用 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'
);
推荐阅读
- c++ - 有没有办法不让工会“过度补偿”对齐?
- python - 以英里为单位的 Python 距离到两个 gps 坐标之间的欧几里得距离
- c# - 有没有办法编写一个方法来调用“AddForce”到 Rigidbody 或 Rigidbody2D 参数?
- latex-environment - 图标题中的引用在表格列表中显示为文本
- python - 为什么模型没有出现在 django 网站上
- javascript - HTML 表格元素不适用于其属性
- angular - 带有订阅的角拦截器无法正常工作
- javascript - 如何使用 Javascript 禁用按钮
- javascript - 引导表搜索不适用于行跨度
- google-analytics - Google Analytics 4 和 AMP - 设置混乱