You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:48:03