
删除了重复数据,增加了唯一索引。
/* ============ 1) 清理 banchengpin_production_order 重复 ============ */
DELETE bo
FROM banchengpin_production_order bo
JOIN (
SELECT MIN(id) AS keep_id, FCONTRACTNO, FNUMBER_SUB, FMATNUM
FROM banchengpin_production_order
GROUP BY FCONTRACTNO, FNUMBER_SUB, FMATNUM
HAVING COUNT(*) > 1
) t
ON bo.FCONTRACTNO = t.FCONTRACTNO
AND bo.FNUMBER_SUB = t.FNUMBER_SUB
AND bo.FMATNUM = t.FMATNUM
WHERE bo.id <> t.keep_id;
/* ============ 2) 清理 material 重复 (FNUMBER = 08100‑3339 出现 3 条) ============ */
DELETE m1
FROM material m1
JOIN (
SELECT MIN(id) AS keep_id, FNUMBER
FROM material
GROUP BY FNUMBER
HAVING COUNT(*) > 1
) t
ON m1.FNUMBER = t.FNUMBER
WHERE m1.id <> t.keep_id;
/* ============ 3) 加唯一索引,防止再插重复 ============ */
ALTER TABLE banchengpin_production_order
ADD UNIQUE KEY uniq_order (FCONTRACTNO, FNUMBER_SUB, FMATNUM);
ALTER TABLE material
ADD UNIQUE KEY uniq_mat (FNUMBER);
出现 重复记录 通常就两个层面的问题:
| 层面 | 直接原因 | 典型触发情形
| 数据库结构 | 没有唯一约束(`UNIQUE KEY` / 组合主键) | 多人或脚本并发INSERT; “导入—撤销—再导入” 流程; 业务上需要更新却用 INSERT,导致同一 合同号+子单号+物料
又插一次
| 业务代码 / 流程 | 写入逻辑不分 “新建” 与 “更新” | ① Excel/接口批量导入时不先 `SELECT` 检查是否已存在;② 回写上游系统时同时写 半成品排产单 和 物料主数据,结果把同一物料也插了多条(如 `081003339` 出现 3 次) |
具体到刚跑出来的结果:
1. `banchengpin_production_order`里每组`FCONTRACTNO + FNUMBER_SUB + FMATNUM` 本应唯一,但很多组合出现 2 条 —— 说明排产单本身被重复写入。
2. `material`里物料编码 `081003339` 有 3 条,左连接时就会把一条排产单放大成 3 行。
3. 没有任何唯一索引阻拦,所以重复一旦写进去,查询就一定会显示出来。
> 一句话:“约束缺位 + 写入脚本不做去重”,是造成页面同一行数据重复出现的根本原因。
| Welcome AbyssalSwamp (http://iot.caffz123.uk:12345/mud/AbyssalSwamp/index/) | caffz.com |