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

如何删除catalog_url_rewrite_product_category表重复url_rewrite_id的其中一条记录

MySQL删除重复url_rewrite_id记录方案

错误写法原因排查

  • 第一种写法错误原因:MySQL的DELETE语法原生不支持直接跟随GROUP BY、HAVING聚合逻辑,你把SELECT的聚合语法直接套用到DELETE上不符合语法规范,因此报语法错误。
  • 第二种写法错误原因:WHERE条件中n1.url_rewrite_id > 1逻辑错误,你需要区分的是同一个url_rewrite_id下的两条不同记录,而非筛选url_rewrite_id本身数值大于1的记录,因此匹配不到符合要求的删除条目。
  • 第三种写法错误原因:只判断了n1.url_rewrite_id = n2.url_rewrite_id,没有添加额外条件区分同组内的两条记录,会导致每条记录都能匹配到同组的另一条记录,最终触发全表删除。

正确实现写法

前提说明

假设catalog_url_rewrite_product_category表存在唯一主键字段(示例统一用id指代,你可以替换为表实际的主键字段名),且每组重复url_rewrite_id固定只有2条记录,以下两种写法均可实现需求:

写法1:自连接写法(兼容MySQL所有版本)

该写法逻辑为保留同组内主键更小的记录,删除主键更大的1条重复记录:

DELETE n1 
FROM catalog_url_rewrite_product_category n1
INNER JOIN catalog_url_rewrite_product_category n2 
  ON n1.url_rewrite_id = n2.url_rewrite_id 
  AND n1.id > n2.id;

建议执行删除前,先把DELETE n1替换为SELECT n1.*查询确认待删除的记录是否符合预期,确认无误后再执行删除操作。


写法2:窗口函数写法(仅支持MySQL 8.0及以上版本)

该写法通过分组排序标记重复记录,直接删除标记为第2条的记录:

WITH duplicate_cte AS (
  SELECT 
    id,
    ROW_NUMBER() OVER(PARTITION BY url_rewrite_id ORDER BY id) AS row_num
  FROM catalog_url_rewrite_product_category
)
DELETE FROM catalog_url_rewrite_product_category
WHERE id IN (SELECT id FROM duplicate_cte WHERE row_num = 2);

内容的提问来源于stack exchange,提问作者G. G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:21:01