MySQL如何删除表列存储的链接数组中所有包含host1的条目
MySQL删除JSON数组列中包含host1的链接条目方案
- 操作前置提醒:操作前务必先对目标表做全量备份,避免误操作导致数据丢失,可先执行SELECT语句验证处理逻辑符合预期后再执行UPDATE操作。
- 假设你的表名为
your_table,存储链接数组的列名为url_list,表主键字段为id;如果url_list是字符串类型存储的JSON格式,方案1中所有用到url_list的地方替换为CAST(url_list AS JSON)即可。
方案1:MySQL 8.0及以上版本(推荐,逻辑稳定容错率高)
通过JSON_TABLE将数组拆分为单行数据,过滤掉含host1的链接后再重新聚合为数组:
-- 第一步:先执行SELECT验证处理结果是否符合预期 SELECT id, url_list AS 原数组, JSON_ARRAYAGG(url) AS 处理后数组 FROM your_table, JSON_TABLE(url_list, '$[*]' COLUMNS (url VARCHAR(255) PATH '$')) AS urls WHERE url NOT LIKE '%host1%' GROUP BY id; -- 第二步:验证无误后执行更新 UPDATE your_table t1 INNER JOIN ( SELECT id, JSON_ARRAYAGG(url) AS new_url_list FROM your_table, JSON_TABLE(url_list, '$[*]' COLUMNS (url VARCHAR(255) PATH '$')) AS urls WHERE url NOT LIKE '%host1%' GROUP BY id ) t2 ON t1.id = t2.id SET t1.url_list = t2.new_url_list -- 可选:仅更新包含host1的行,减少数据操作量 WHERE t1.url_list LIKE '%host1%';
方案2:MySQL 5.7版本(无JSON_TABLE函数,正则替换实现)
针对低版本MySQL没有数组拆分函数的场景,通过正则匹配直接删除host1对应的条目:
-- 第一步:先执行SELECT验证替换结果是否符合预期 SELECT url_list AS 原数组, REGEXP_REPLACE( REGEXP_REPLACE(url_list, '"http[^"]*host1[^"]*",?', ''), ',?]', ']' -- 处理删除条目后末尾多余的逗号 ) AS 处理后数组 FROM your_table WHERE url_list LIKE '%host1%'; -- 第二步:验证无误后执行更新 UPDATE your_table SET url_list = REGEXP_REPLACE( REGEXP_REPLACE(url_list, '"http[^"]*host1[^"]*",?', ''), ',?]', ']' ) WHERE url_list LIKE '%host1%';
如果某行数组内所有链接都包含host1,处理后会得到空数组[],如果需要删除空数组对应的行,可额外执行DELETE FROM your_table WHERE url_list = '[]'。
内容的提问来源于stack exchange,提问作者SRoque
相关产品推荐
相关产品推荐

