-- ============================================================================= -- S0-STANDARD-BOM-MATERIAL-FK-BACKFILL-EXECUTION-1 -- 目的:回填 ProductStructureMaster legacy 行(2026-05-27/28 一次性导入只写父/子项编码、 -- 未写后加的 FK 列)的 ParentMaterialId / ComponentMaterialId,按 工厂 + 租户 限定 -- 1:1 关联 ItemMaster.RecID(ItemMaster 唯一索引 uk_ItemMaster_factory_item=(factory_ref_id,ItemNum) -- 保证工厂内编码唯一 → 无多匹配)。 -- 范围:仅 UPDATE FK IS NULL 的行;只写 FK,不改 ParentItem/ComponentItem 编码、不改 ItemMaster、 -- 不改状态字段(IsActive/IsEnabled)、不删行;不覆盖已有非 NULL FK;不更新 demo RecID=1 -- (其 FK=0 非 NULL,IS NULL 不命中,且 RecID<>1 显式排除)。 -- 安全:工厂限定(p.FactoryRefId=im.factory_ref_id) + 租户限定(p.tenant_id=im.tenant_id); -- 阶段 0 只读校验:父/子各 53031 行可回填,多匹配 0,匹配不到 0,跨工厂/跨租户 0。 -- 幂等:WHERE FK IS NULL → 重跑只命中剩余 NULL,已回填行不再变动。 -- 回滚(如需,人工执行,非本脚本自动): -- UPDATE ProductStructureMaster SET ParentMaterialId=NULL, ComponentMaterialId=NULL -- WHERE RecID<>1 AND CreatedAt BETWEEN '2026-05-27' AND '2026-05-28 23:59:59'; -- ============================================================================= -- 段 1:回填父项 ParentMaterialId UPDATE ProductStructureMaster p JOIN ItemMaster im ON im.ItemNum = p.ParentItem AND im.factory_ref_id = p.FactoryRefId AND im.tenant_id = p.tenant_id SET p.ParentMaterialId = im.RecID WHERE p.ParentMaterialId IS NULL AND p.ParentItem IS NOT NULL AND p.ParentItem <> '' AND p.RecID <> 1; -- 段 2:回填子项 ComponentMaterialId UPDATE ProductStructureMaster p JOIN ItemMaster im ON im.ItemNum = p.ComponentItem AND im.factory_ref_id = p.FactoryRefId AND im.tenant_id = p.tenant_id SET p.ComponentMaterialId = im.RecID WHERE p.ComponentMaterialId IS NULL AND p.ComponentItem IS NOT NULL AND p.ComponentItem <> '' AND p.RecID <> 1;