50 lines
1.8 KiB
SQL
50 lines
1.8 KiB
SQL
-- 应收账单转单号快照迁移
|
|
-- 适用于已经执行过 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;
|