-- 应收账单转单号快照迁移 -- 适用于已经执行过 ar/ar_bill.sql 的存量数据库。 -- 本脚本可重复执行,不删除账单明细,不覆盖已经存在的转单号快照。 SET NAMES utf8mb4; SET @db_name := DATABASE(); -- 1. 账单明细保存生成账单时的转单号快照。 SET @has_transfer_no := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'ar_bill_detail' AND COLUMN_NAME = 'transfer_no' ); SET @sql := IF(@has_transfer_no = 0, 'ALTER TABLE ar_bill_detail ADD COLUMN transfer_no VARCHAR(64) DEFAULT NULL COMMENT ''转单号快照'' AFTER tracking_no', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 2. 详情按账单查询转单号时使用组合索引。 SET @has_transfer_index := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @db_name AND TABLE_NAME = 'ar_bill_detail' AND INDEX_NAME = 'idx_ar_bill_detail_bill_transfer_no' ); SET @sql := IF(@has_transfer_index = 0, 'ALTER TABLE ar_bill_detail ADD KEY idx_ar_bill_detail_bill_transfer_no (ar_bill_id, transfer_no)', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 3. 历史数据尽力回填,仅填充空值,不覆盖账单生成时已经保存的快照。 -- 如果来源订单后续修改过转单号,回填值仅代表当前来源表值,不能视为严格历史值。 UPDATE ar_bill_detail d JOIN prc_order_bill p ON p.bill_id = d.prc_order_bill_id SET d.transfer_no = p.transfer_no WHERE d.transfer_no IS NULL AND p.transfer_no IS NOT NULL; -- 4. 执行后核验字段和回填数量。 SELECT COUNT(*) AS detail_count, SUM(CASE WHEN transfer_no IS NOT NULL AND TRIM(transfer_no) <> '' THEN 1 ELSE 0 END) AS transfer_no_count FROM ar_bill_detail;