-- 夜间停机:计费/应收/应付 UUID(varchar36) -> bigint AUTO_INCREMENT -- 执行前:1)停 BMS 应用与异步任务 2)全库或至少关键表备份 3)建议先在从库/备份库干跑 -- 范围 PK:prc_order_bill.bill_id / prc_income_bill.income_bill_id / prc_income_bill_fee.fee_id / prc_pay_bill.pay_bill_id / prc_pay_bill_fee.fee_id -- 范围 FK/引用:prc_order_bill_ext、income/pay 上 bill_id、prc_billing_task、ar_bill_detail*、ar_bill_generate_task、pay_bill_line/log/diff -- 不动:ar_bill 等已 bigint;prc_quote* 报价 UUID;任务 taskId -- 回滚:用宝塔/整库备份恢复 + 旧后端包(本脚本不再做同库 *_bak_uuid 拷贝) -- -- FK盘点: fk_income_bill_order_bill, fk_income_bill_fee_order, fk_order_bill_ext_bill, fk_pay_bill_order_bill, fk_pay_bill_fee_order SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ========== 0. 前置检查 ========== SELECT 'prc_order_bill' AS tbl, COUNT(*) AS cnt FROM prc_order_bill UNION ALL SELECT 'prc_order_bill_ext', COUNT(*) FROM prc_order_bill_ext UNION ALL SELECT 'prc_income_bill', COUNT(*) FROM prc_income_bill UNION ALL SELECT 'prc_income_bill_fee', COUNT(*) FROM prc_income_bill_fee UNION ALL SELECT 'prc_pay_bill', COUNT(*) FROM prc_pay_bill UNION ALL SELECT 'prc_pay_bill_fee', COUNT(*) FROM prc_pay_bill_fee UNION ALL SELECT 'ar_bill_detail', COUNT(*) FROM ar_bill_detail UNION ALL SELECT 'ar_bill_detail_fee', COUNT(*) FROM ar_bill_detail_fee; SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IN ('prc_order_bill','prc_income_bill','prc_income_bill_fee','prc_pay_bill','prc_pay_bill_fee') ORDER BY TABLE_NAME, CONSTRAINT_NAME; -- ========== 1. 跳过同库 bak(已在宝塔做整库备份,避免再拷一份占盘/耗时) ========== -- 回滚请用宝塔备份恢复,不再依赖 *_bak_uuid -- ========== 2. 映射表 ========== DROP TABLE IF EXISTS `mig_map_order_bill`; CREATE TABLE `mig_map_order_bill` ( `old_id` varchar(36) NOT NULL, `new_id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`old_id`), UNIQUE KEY `uk_new_id` (`new_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `mig_map_order_bill` (`old_id`) SELECT `bill_id` FROM `prc_order_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `bill_id`; DROP TABLE IF EXISTS `mig_map_income_bill`; CREATE TABLE `mig_map_income_bill` ( `old_id` varchar(36) NOT NULL, `new_id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`old_id`), UNIQUE KEY `uk_new_id` (`new_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `mig_map_income_bill` (`old_id`) SELECT `income_bill_id` FROM `prc_income_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `income_bill_id`; DROP TABLE IF EXISTS `mig_map_income_fee`; CREATE TABLE `mig_map_income_fee` ( `old_id` varchar(36) NOT NULL, `new_id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`old_id`), UNIQUE KEY `uk_new_id` (`new_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `mig_map_income_fee` (`old_id`) SELECT `fee_id` FROM `prc_income_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`; DROP TABLE IF EXISTS `mig_map_pay_bill`; CREATE TABLE `mig_map_pay_bill` ( `old_id` varchar(36) NOT NULL, `new_id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`old_id`), UNIQUE KEY `uk_new_id` (`new_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `mig_map_pay_bill` (`old_id`) SELECT `pay_bill_id` FROM `prc_pay_bill` ORDER BY IFNULL(`create_time`, '1970-01-01'), `pay_bill_id`; DROP TABLE IF EXISTS `mig_map_pay_fee`; CREATE TABLE `mig_map_pay_fee` ( `old_id` varchar(36) NOT NULL, `new_id` bigint NOT NULL AUTO_INCREMENT, PRIMARY KEY (`old_id`), UNIQUE KEY `uk_new_id` (`new_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `mig_map_pay_fee` (`old_id`) SELECT `fee_id` FROM `prc_pay_bill_fee` ORDER BY IFNULL(`create_time`, '1970-01-01'), `fee_id`; -- ========== 3. 重建核心表(动态列) ========== DROP TABLE IF EXISTS `prc_order_bill_new`; CREATE TABLE `prc_order_bill_new` LIKE `prc_order_bill`; ALTER TABLE `prc_order_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL AUTO_INCREMENT; SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id'); SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill' AND COLUMN_NAME NOT IN ('bill_id'); SET @sql := CONCAT( 'INSERT INTO `prc_order_bill_new` (`bill_id`', IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ', 'SELECT mo.new_id', IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ', 'FROM `prc_order_bill` t ', 'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` ' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS `prc_income_bill_new`; CREATE TABLE `prc_income_bill_new` LIKE `prc_income_bill`; ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `income_bill_id` bigint NOT NULL AUTO_INCREMENT; ALTER TABLE `prc_income_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL; SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id'); SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND COLUMN_NAME NOT IN ('income_bill_id','bill_id'); SET @sql := CONCAT( 'INSERT INTO `prc_income_bill_new` (`income_bill_id`, `bill_id`', IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ', 'SELECT mi.new_id, mo.new_id', IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ', 'FROM `prc_income_bill` t ', 'JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` ' ,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` ' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS `prc_income_bill_fee_new`; CREATE TABLE `prc_income_bill_fee_new` LIKE `prc_income_bill_fee`; ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT; ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL; ALTER TABLE `prc_income_bill_fee_new` MODIFY COLUMN `income_bill_id` bigint NULL; SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id'); SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','income_bill_id'); SET @sql := CONCAT( 'INSERT INTO `prc_income_bill_fee_new` (`fee_id`, `bill_id`, `income_bill_id`', IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ', 'SELECT mf.new_id, mo.new_id, mi.new_id', IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ', 'FROM `prc_income_bill_fee` t ', 'JOIN `mig_map_income_fee` mf ON mf.old_id = t.`fee_id` ' ,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` ' ,'LEFT JOIN `mig_map_income_bill` mi ON mi.old_id = t.`income_bill_id` ' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS `prc_pay_bill_new`; CREATE TABLE `prc_pay_bill_new` LIKE `prc_pay_bill`; ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `pay_bill_id` bigint NOT NULL AUTO_INCREMENT; ALTER TABLE `prc_pay_bill_new` MODIFY COLUMN `bill_id` bigint NOT NULL; SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id'); SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND COLUMN_NAME NOT IN ('pay_bill_id','bill_id'); SET @sql := CONCAT( 'INSERT INTO `prc_pay_bill_new` (`pay_bill_id`, `bill_id`', IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ', 'SELECT mp.new_id, mo.new_id', IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ', 'FROM `prc_pay_bill` t ', 'JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` ' ,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` ' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE IF EXISTS `prc_pay_bill_fee_new`; CREATE TABLE `prc_pay_bill_fee_new` LIKE `prc_pay_bill_fee`; ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `fee_id` bigint NOT NULL AUTO_INCREMENT; ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `bill_id` bigint NOT NULL; ALTER TABLE `prc_pay_bill_fee_new` MODIFY COLUMN `pay_bill_id` bigint NULL; SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @cols_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id'); SELECT GROUP_CONCAT(CONCAT('t.`', COLUMN_NAME, '`') ORDER BY ORDINAL_POSITION SEPARATOR ',') INTO @sels_rest FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND COLUMN_NAME NOT IN ('fee_id','bill_id','pay_bill_id'); SET @sql := CONCAT( 'INSERT INTO `prc_pay_bill_fee_new` (`fee_id`, `bill_id`, `pay_bill_id`', IF(@cols_rest IS NULL OR @cols_rest = '', '', CONCAT(', ', @cols_rest)), ') ', 'SELECT mf.new_id, mo.new_id, mp.new_id', IF(@sels_rest IS NULL OR @sels_rest = '', '', CONCAT(', ', @sels_rest)), ' ', 'FROM `prc_pay_bill_fee` t ', 'JOIN `mig_map_pay_fee` mf ON mf.old_id = t.`fee_id` ' ,'JOIN `mig_map_order_bill` mo ON mo.old_id = t.`bill_id` ' ,'LEFT JOIN `mig_map_pay_bill` mp ON mp.old_id = t.`pay_bill_id` ' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- --- prc_order_bill_ext 阴影列 --- SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND COLUMN_NAME='bill_id_bi')=0, 'ALTER TABLE `prc_order_bill_ext` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; UPDATE `prc_order_bill_ext` e JOIN `mig_map_order_bill` m ON m.old_id = e.bill_id SET e.bill_id_bi = m.new_id; -- ========== 4. 引用表阴影列 ========== SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id_bi')=0, 'ALTER TABLE `ar_bill_detail` ADD COLUMN `prc_order_bill_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND COLUMN_NAME='prc_order_bill_id')>0, 'UPDATE `ar_bill_detail` x JOIN `mig_map_order_bill` m ON m.old_id = x.`prc_order_bill_id` SET x.`prc_order_bill_id_bi` = m.new_id', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id_bi')=0, 'ALTER TABLE `ar_bill_detail_fee` ADD COLUMN `prc_income_bill_fee_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND COLUMN_NAME='prc_income_bill_fee_id')>0, 'UPDATE `ar_bill_detail_fee` x JOIN `mig_map_income_fee` m ON m.old_id = x.`prc_income_bill_fee_id` SET x.`prc_income_bill_fee_id_bi` = m.new_id', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')=0, 'ALTER TABLE `ar_bill_generate_task` ADD COLUMN `last_source_bill_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id')>0, 'UPDATE `ar_bill_generate_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`last_source_bill_id` SET x.`last_source_bill_id_bi` = m.new_id WHERE x.`last_source_bill_id` IS NOT NULL AND x.`last_source_bill_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')=0, 'ALTER TABLE `prc_billing_task` ADD COLUMN `bill_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id')>0, 'UPDATE `prc_billing_task` x JOIN `mig_map_order_bill` m ON m.old_id = x.`bill_id` SET x.`bill_id_bi` = m.new_id WHERE x.`bill_id` IS NOT NULL AND x.`bill_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')=0, 'ALTER TABLE `pay_bill_line` ADD COLUMN `order_bill_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id')>0, 'UPDATE `pay_bill_line` x JOIN `mig_map_order_bill` m ON m.old_id = x.`order_bill_id` SET x.`order_bill_id_bi` = m.new_id WHERE x.`order_bill_id` IS NOT NULL AND x.`order_bill_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')=0, 'ALTER TABLE `pay_bill_line` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id')>0, 'UPDATE `pay_bill_line` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')=0, 'ALTER TABLE `pay_bill_log` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id')>0, 'UPDATE `pay_bill_log` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')=0, 'ALTER TABLE `pay_bill_diff` ADD COLUMN `fee_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id')>0, 'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`fee_id` SET x.`fee_id_bi` = m.new_id WHERE x.`fee_id` IS NOT NULL AND x.`fee_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0 AND (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')=0, 'ALTER TABLE `pay_bill_diff` ADD COLUMN `adjust_fee_id_bi` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id')>0, 'UPDATE `pay_bill_diff` x JOIN `mig_map_pay_fee` m ON m.old_id = x.`adjust_fee_id` SET x.`adjust_fee_id_bi` = m.new_id WHERE x.`adjust_fee_id` IS NOT NULL AND x.`adjust_fee_id` <> \'\'', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ========== 5. 校验(bad 必须为 0,行数必须一致) ========== SELECT 'ar_detail_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail WHERE prc_order_bill_id_bi IS NULL; SELECT 'ar_fee_orphan' AS chk, COUNT(*) AS bad FROM ar_bill_detail_fee WHERE prc_income_bill_fee_id_bi IS NULL; SELECT 'ext_orphan' AS chk, COUNT(*) AS bad FROM prc_order_bill_ext WHERE bill_id_bi IS NULL; SELECT 'order_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_order_bill) m, (SELECT COUNT(*) FROM prc_order_bill) s, (SELECT COUNT(*) FROM prc_order_bill_new) n; SELECT 'income_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_bill) m, (SELECT COUNT(*) FROM prc_income_bill) s, (SELECT COUNT(*) FROM prc_income_bill_new) n; SELECT 'income_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_income_fee) m, (SELECT COUNT(*) FROM prc_income_bill_fee) s, (SELECT COUNT(*) FROM prc_income_bill_fee_new) n; SELECT 'pay_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_bill) m, (SELECT COUNT(*) FROM prc_pay_bill) s, (SELECT COUNT(*) FROM prc_pay_bill_new) n; SELECT 'pay_fee_cnt' AS chk, (SELECT COUNT(*) FROM mig_map_pay_fee) m, (SELECT COUNT(*) FROM prc_pay_bill_fee) s, (SELECT COUNT(*) FROM prc_pay_bill_fee_new) n; -- 若校验失败:STOP,不执行第 6 步 -- ========== 6. 掉旧 FK 后换表 ========== SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill' AND CONSTRAINT_NAME='fk_income_bill_order_bill')>0, 'ALTER TABLE `prc_income_bill` DROP FOREIGN KEY `fk_income_bill_order_bill`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_income_bill_fee' AND CONSTRAINT_NAME='fk_income_bill_fee_order')>0, 'ALTER TABLE `prc_income_bill_fee` DROP FOREIGN KEY `fk_income_bill_fee_order`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_order_bill_ext' AND CONSTRAINT_NAME='fk_order_bill_ext_bill')>0, 'ALTER TABLE `prc_order_bill_ext` DROP FOREIGN KEY `fk_order_bill_ext_bill`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill' AND CONSTRAINT_NAME='fk_pay_bill_order_bill')>0, 'ALTER TABLE `prc_pay_bill` DROP FOREIGN KEY `fk_pay_bill_order_bill`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_pay_bill_fee' AND CONSTRAINT_NAME='fk_pay_bill_fee_order')>0, 'ALTER TABLE `prc_pay_bill_fee` DROP FOREIGN KEY `fk_pay_bill_fee_order`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; RENAME TABLE `prc_order_bill` TO `prc_order_bill_old_uuid`, `prc_order_bill_new` TO `prc_order_bill`, `prc_income_bill` TO `prc_income_bill_old_uuid`, `prc_income_bill_new` TO `prc_income_bill`, `prc_income_bill_fee` TO `prc_income_bill_fee_old_uuid`, `prc_income_bill_fee_new` TO `prc_income_bill_fee`, `prc_pay_bill` TO `prc_pay_bill_old_uuid`, `prc_pay_bill_new` TO `prc_pay_bill`, `prc_pay_bill_fee` TO `prc_pay_bill_fee_old_uuid`, `prc_pay_bill_fee_new` TO `prc_pay_bill_fee`; -- --- ext / AR / task 引用列落地 --- ALTER TABLE `prc_order_bill_ext` DROP PRIMARY KEY; ALTER TABLE `prc_order_bill_ext` DROP COLUMN `bill_id`; ALTER TABLE `prc_order_bill_ext` CHANGE COLUMN `bill_id_bi` `bill_id` bigint NOT NULL; ALTER TABLE `prc_order_bill_ext` ADD PRIMARY KEY (`bill_id`); SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='uk_ar_bill_detail_source')>0, 'ALTER TABLE `ar_bill_detail` DROP INDEX `uk_ar_bill_detail_source`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail' AND INDEX_NAME='idx_ar_bill_detail_source')>0, 'ALTER TABLE `ar_bill_detail` DROP INDEX `idx_ar_bill_detail_source`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ALTER TABLE `ar_bill_detail` DROP COLUMN `prc_order_bill_id`; ALTER TABLE `ar_bill_detail` CHANGE COLUMN `prc_order_bill_id_bi` `prc_order_bill_id` bigint NOT NULL; ALTER TABLE `ar_bill_detail` ADD UNIQUE KEY `uk_ar_bill_detail_source` (`ar_bill_id`,`prc_order_bill_id`); ALTER TABLE `ar_bill_detail` ADD KEY `idx_ar_bill_detail_source` (`prc_order_bill_id`); SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='uk_ar_detail_prc_income_fee')>0, 'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `uk_ar_detail_prc_income_fee`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_detail_fee' AND INDEX_NAME='idx_ar_detail_prc_income_fee')>0, 'ALTER TABLE `ar_bill_detail_fee` DROP INDEX `idx_ar_detail_prc_income_fee`', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ALTER TABLE `ar_bill_detail_fee` DROP COLUMN `prc_income_bill_fee_id`; ALTER TABLE `ar_bill_detail_fee` CHANGE COLUMN `prc_income_bill_fee_id_bi` `prc_income_bill_fee_id` bigint NOT NULL; ALTER TABLE `ar_bill_detail_fee` ADD UNIQUE KEY `uk_ar_detail_prc_income_fee` (`detail_id`,`prc_income_bill_fee_id`); ALTER TABLE `ar_bill_detail_fee` ADD KEY `idx_ar_detail_prc_income_fee` (`prc_income_bill_fee_id`); SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ar_bill_generate_task' AND COLUMN_NAME='last_source_bill_id_bi')>0, 'ALTER TABLE `ar_bill_generate_task` DROP COLUMN `last_source_bill_id`, CHANGE COLUMN `last_source_bill_id_bi` `last_source_bill_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='prc_billing_task' AND COLUMN_NAME='bill_id_bi')>0, 'ALTER TABLE `prc_billing_task` DROP COLUMN `bill_id`, CHANGE COLUMN `bill_id_bi` `bill_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='order_bill_id_bi')>0, 'ALTER TABLE `pay_bill_line` DROP COLUMN `order_bill_id`, CHANGE COLUMN `order_bill_id_bi` `order_bill_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_line' AND COLUMN_NAME='fee_id_bi')>0, 'ALTER TABLE `pay_bill_line` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_log' AND COLUMN_NAME='fee_id_bi')>0, 'ALTER TABLE `pay_bill_log` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='fee_id_bi')>0, 'ALTER TABLE `pay_bill_diff` DROP COLUMN `fee_id`, CHANGE COLUMN `fee_id_bi` `fee_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='pay_bill_diff' AND COLUMN_NAME='adjust_fee_id_bi')>0, 'ALTER TABLE `pay_bill_diff` DROP COLUMN `adjust_fee_id`, CHANGE COLUMN `adjust_fee_id_bi` `adjust_fee_id` bigint NULL', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ========== 7. 重建 FK + AUTO_INCREMENT ========== ALTER TABLE `prc_order_bill_ext` ADD CONSTRAINT `fk_order_bill_ext_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE; ALTER TABLE `prc_income_bill` ADD CONSTRAINT `fk_income_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE; ALTER TABLE `prc_income_bill_fee` ADD CONSTRAINT `fk_income_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE; ALTER TABLE `prc_pay_bill` ADD CONSTRAINT `fk_pay_bill_order_bill` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE; ALTER TABLE `prc_pay_bill_fee` ADD CONSTRAINT `fk_pay_bill_fee_order` FOREIGN KEY (`bill_id`) REFERENCES `prc_order_bill` (`bill_id`) ON DELETE CASCADE; SET @ai := (SELECT IFNULL(MAX(`bill_id`),0)+1 FROM `prc_order_bill`); SET @sql := CONCAT('ALTER TABLE `prc_order_bill` AUTO_INCREMENT=', @ai); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ai := (SELECT IFNULL(MAX(`income_bill_id`),0)+1 FROM `prc_income_bill`); SET @sql := CONCAT('ALTER TABLE `prc_income_bill` AUTO_INCREMENT=', @ai); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_income_bill_fee`); SET @sql := CONCAT('ALTER TABLE `prc_income_bill_fee` AUTO_INCREMENT=', @ai); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ai := (SELECT IFNULL(MAX(`pay_bill_id`),0)+1 FROM `prc_pay_bill`); SET @sql := CONCAT('ALTER TABLE `prc_pay_bill` AUTO_INCREMENT=', @ai); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ai := (SELECT IFNULL(MAX(`fee_id`),0)+1 FROM `prc_pay_bill_fee`); SET @sql := CONCAT('ALTER TABLE `prc_pay_bill_fee` AUTO_INCREMENT=', @ai); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET FOREIGN_KEY_CHECKS = 1; -- ========== 8. 抽查 ========== SELECT d.detail_id, d.prc_order_bill_id, o.order_no FROM ar_bill_detail d JOIN prc_order_bill o ON o.bill_id = d.prc_order_bill_id LIMIT 5; SELECT f.detail_fee_id, f.prc_income_bill_fee_id, i.fee_type FROM ar_bill_detail_fee f JOIN prc_income_bill_fee i ON i.fee_id = f.prc_income_bill_fee_id LIMIT 5; -- ========== 9. 回滚说明(勿自动执行) ========== -- 用宝塔/整库备份恢复 + 部署旧后端包 -- -- ========== 10. 次日清理 ========== -- DROP TABLE IF EXISTS prc_order_bill_old_uuid, prc_income_bill_old_uuid, -- prc_income_bill_fee_old_uuid, prc_pay_bill_old_uuid, prc_pay_bill_fee_old_uuid; -- DROP TABLE IF EXISTS mig_map_order_bill, mig_map_income_bill, mig_map_income_fee, mig_map_pay_bill, mig_map_pay_fee; -- -- 冒烟:1)新建/重计费 2)出应收 3)查应付费用 4)旧 AR 明细关联订单