-- ============================================================================ -- 甲方报价系统优化 - 数据库迁移脚本 -- 日期: 2026-06-01 -- 说明: -- 1. biz_client_quote_item 表添加 material_id 字段,建立与物料表的正式关联 -- 2. 添加必要的索引优化查询性能 -- 3. 添加统计数据辅助字段 -- 4. 修复历史数据中的 material_id 关联 -- ============================================================================ -- ============================================================================ -- PART 1: 甲方报价明细表 - 添加 material_id 字段 -- ============================================================================ ALTER TABLE biz_client_quote_item ADD COLUMN material_id BIGINT DEFAULT NULL COMMENT '关联物料ID(biz_material.material_id)' AFTER quote_id; -- 创建索引以加速按物料查询 CREATE INDEX idx_cqi_quote_id ON biz_client_quote_item (quote_id); CREATE INDEX idx_cqi_material_id ON biz_client_quote_item (material_id); -- ============================================================================ -- PART 2: 甲方报价主表 - 添加统计优化索引 -- ============================================================================ CREATE INDEX idx_cq_create_time ON biz_client_quote (create_time); CREATE INDEX idx_cq_client_name ON biz_client_quote (client_name); CREATE INDEX idx_cq_status ON biz_client_quote (status); -- ============================================================================ -- PART 3: 修复历史数据 - 通过物料名称匹配回填 material_id -- ============================================================================ -- 注意: 此操作为一次性数据修复,基于 material_name 精确匹配。 -- 如果存在同名的多个物料,只会关联第一个匹配到的物料ID。 -- 请在执行前确认数据准确性。 UPDATE biz_client_quote_item cqi JOIN biz_material m ON cqi.material_name = m.material_name SET cqi.material_id = m.material_id WHERE cqi.material_id IS NULL AND cqi.material_name IS NOT NULL AND cqi.material_name != ''; -- ============================================================================ -- PART 4: 验证数据修复结果 -- ============================================================================ -- 检查仍有未关联的记录数(如果 > 0,说明有些物料名称在 biz_material 表中不存在) -- SELECT COUNT(*) AS unlinked_count -- FROM biz_client_quote_item -- WHERE material_id IS NULL AND material_name IS NOT NULL AND material_name != ''; -- 查看关联情况统计 -- SELECT -- CASE WHEN cqi.material_id IS NOT NULL THEN '已关联' ELSE '未关联' END AS status, -- COUNT(*) AS count -- FROM biz_client_quote_item cqi -- GROUP BY CASE WHEN cqi.material_id IS NOT NULL THEN '已关联' ELSE '未关联' END; -- ============================================================================ -- 完成 -- ============================================================================