dedup_device_inventory_unique.sql 1.3 KB

123456789101112131415161718192021222324252627282930
  1. -- ============================================================================
  2. -- t_device_inventory 去重 + 添加唯一约束
  3. --
  4. -- 背景:同一设备同一商品存在多条记录,原因是:
  5. -- 1. ReplenishmentOrderServiceImpl.completeOrder 用 productCode 查重,
  6. -- 与其他路径(用 productId)不一致
  7. -- 2. 数据库层缺少 (device_id, product_id) 唯一约束,并发场景下查重失效
  8. --
  9. -- 执行前建议:先 SELECT 确认重复数据量
  10. -- SELECT device_id, product_id, COUNT(*) cnt FROM t_device_inventory
  11. -- WHERE product_id IS NOT NULL GROUP BY device_id, product_id HAVING cnt > 1;
  12. -- ============================================================================
  13. -- Step 1: 清理重复记录
  14. -- 策略:每组 (device_id, product_id) 保留 id 最大的那条(最新插入的),删除其余
  15. DELETE FROM t_device_inventory
  16. WHERE id NOT IN (
  17. SELECT max_id FROM (
  18. SELECT MAX(id) AS max_id
  19. FROM t_device_inventory
  20. WHERE product_id IS NOT NULL
  21. GROUP BY device_id, product_id
  22. ) AS kept
  23. )
  24. AND product_id IS NOT NULL;
  25. -- Step 2: 添加唯一约束,从根本上杜绝重复
  26. -- 如果该约束已存在会报错 Duplicate key name,这是预期行为
  27. ALTER TABLE t_device_inventory
  28. ADD UNIQUE KEY uk_device_product (device_id, product_id);