-- ============================================================ -- MES 物料 ID 迁移脚本 -- 目的:将 mes_md_item.id 更新为与 mdm_item.id 一致 -- 执行前请备份数据库! -- ============================================================ -- 1. 创建临时映射表 DROP TEMPORARY TABLE IF EXISTS tmp_item_id_mapping; CREATE TEMPORARY TABLE tmp_item_id_mapping ( old_id BIGINT NOT NULL, new_id BIGINT NOT NULL, code VARCHAR(64), PRIMARY KEY (old_id) ); -- 2. 插入需要迁移的物料映射数据 INSERT INTO tmp_item_id_mapping (old_id, new_id, code) SELECT id, mdm_item_id, code FROM mes_md_item WHERE mdm_item_id IS NOT NULL AND id != mdm_item_id; -- 查看需要迁移的数据 SELECT * FROM tmp_item_id_mapping; -- 3. 禁用外键检查(避免外键约束阻止更新) SET FOREIGN_KEY_CHECKS = 0; -- 4. 更新所有引用 mes_md_item.id 的表 -- 注意:以下语句会更新所有 item_id 字段 -- 4.1 基础数据表 UPDATE mes_md_item_batch_config t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_md_product_bom t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_md_product_sip t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_md_product_sop t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.2 生产相关表 UPDATE mes_pro_card t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_feedback t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_route_product t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_route_product_bom t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_task t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_task_issue t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_pro_work_order_bom t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.3 质量相关表 UPDATE mes_qc_indicator_result t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_qc_ipqc t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_qc_iqc t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_qc_oqc t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_qc_rqc t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_qc_template_item t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.4 仓库管理表 - 入库 UPDATE mes_wm_arrival_notice_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_item_receipt_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_item_receipt_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_misc_receipt_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_misc_receipt_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_outsource_receipt_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_outsource_receipt_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_receipt_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_receipt_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.5 仓库管理表 - 出库 UPDATE mes_wm_item_consume_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_item_consume_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_misc_issue_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_misc_issue_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_outsource_issue_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_outsource_issue_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_issue_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_issue_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_issue_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_issue_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.6 仓库管理表 - 销售/退货 UPDATE mes_wm_product_sales_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_sales_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_sales_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_sales_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_vendor_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_return_vendor_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_sales_notice_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.7 仓库管理表 - 其他 UPDATE mes_wm_batch t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_material_stock t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_package_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_sn t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_stock_reserve t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_stock_taking_plan_param t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_stock_taking_task_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_stock_taking_task_result t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_transaction t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_transfer_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_transfer_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 4.8 生产产出表 UPDATE mes_wm_product_produce_detail t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; UPDATE mes_wm_product_produce_line t JOIN tmp_item_id_mapping m ON t.item_id = m.old_id SET t.item_id = m.new_id; -- 5. 更新主表 mes_md_item 的 id -- 由于 id 是主键,需要先删除旧记录再插入新记录 -- 创建临时表保存完整数据 DROP TEMPORARY TABLE IF EXISTS tmp_mes_md_item; CREATE TEMPORARY TABLE tmp_mes_md_item AS SELECT * FROM mes_md_item; -- 删除需要迁移的记录 DELETE FROM mes_md_item WHERE id IN (SELECT old_id FROM tmp_item_id_mapping); -- 使用新 ID 重新插入 INSERT INTO mes_md_item ( id, mdm_item_id, code, name, specification, unit_measure_id, item_type_id, status, safe_stock_flag, min_stock, max_stock, high_value, batch_flag, remark, creator, create_time, updater, update_time, deleted ) SELECT m.new_id AS id, -- 使用 MDM 物料 ID t.mdm_item_id, t.code, t.name, t.specification, t.unit_measure_id, t.item_type_id, t.status, t.safe_stock_flag, t.min_stock, t.max_stock, t.high_value, t.batch_flag, t.remark, t.creator, t.create_time, t.updater, t.update_time, t.deleted FROM tmp_mes_md_item t JOIN tmp_item_id_mapping m ON t.id = m.old_id; -- 6. 重新启用外键检查 SET FOREIGN_KEY_CHECKS = 1; -- 7. 清理临时表 DROP TEMPORARY TABLE IF EXISTS tmp_item_id_mapping; DROP TEMPORARY TABLE IF EXISTS tmp_mes_md_item; -- 8. 验证迁移结果 SELECT id, mdm_item_id, code, name FROM mes_md_item WHERE mdm_item_id IS NOT NULL; -- 检查是否还有 id != mdm_item_id 的记录 SELECT COUNT(*) AS need_migration_count FROM mes_md_item WHERE mdm_item_id IS NOT NULL AND id != mdm_item_id;