Files
ccdi/sql/migration/2026-04-16-merge-ccdi-account-result-into-info.sql
2026-04-17 10:18:13 +08:00

157 lines
5.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 合并账户库双表:将 ccdi_account_result 分析字段并回 ccdi_account_info并删除旧表。
-- 执行说明:涉及中文内容时请使用 bin/mysql_utf8_exec.sh 执行,确保会话字符集为 utf8mb4。
DELIMITER //
DROP PROCEDURE IF EXISTS `merge_ccdi_account_result_into_info`//
CREATE PROCEDURE `merge_ccdi_account_result_into_info`()
BEGIN
DECLARE duplicate_count INT DEFAULT 0;
DECLARE result_table_exists INT DEFAULT 0;
SELECT COUNT(*)
INTO duplicate_count
FROM (
SELECT account_no
FROM ccdi_account_info
WHERE account_no IS NOT NULL
AND account_no <> ''
GROUP BY account_no
HAVING COUNT(*) > 1
) duplicated_accounts;
IF duplicate_count > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'ccdi_account_info.account_no 存在重复数据,禁止执行账户库合表迁移。';
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'is_self_account'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `is_self_account` TINYINT NOT NULL DEFAULT 1 COMMENT '是否本人账户' AFTER `currency`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'monthly_avg_trans_count'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `monthly_avg_trans_count` INT DEFAULT NULL COMMENT '月均交易笔数' AFTER `is_self_account`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'monthly_avg_trans_amount'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `monthly_avg_trans_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '月均交易金额' AFTER `monthly_avg_trans_count`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'trans_freq_type'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `trans_freq_type` VARCHAR(32) DEFAULT NULL COMMENT '交易频率类型' AFTER `monthly_avg_trans_amount`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'dr_max_single_amount'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `dr_max_single_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单笔支出金额' AFTER `trans_freq_type`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'cr_max_single_amount'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `cr_max_single_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单笔收入金额' AFTER `dr_max_single_amount`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'dr_max_daily_amount'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `dr_max_daily_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单日支出金额' AFTER `cr_max_single_amount`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'cr_max_daily_amount'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `cr_max_daily_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单日收入金额' AFTER `dr_max_daily_amount`;
END IF;
IF NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_info'
AND column_name = 'trans_risk_level'
) THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `trans_risk_level` VARCHAR(32) DEFAULT NULL COMMENT '交易风险等级' AFTER `cr_max_daily_amount`;
END IF;
SELECT COUNT(*)
INTO result_table_exists
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = 'ccdi_account_result';
IF result_table_exists > 0 THEN
UPDATE `ccdi_account_info` ai
JOIN `ccdi_account_result` ar
ON ai.account_no = ar.account_no
SET ai.is_self_account = ar.is_self_account,
ai.monthly_avg_trans_count = ar.monthly_avg_trans_count,
ai.monthly_avg_trans_amount = ar.monthly_avg_trans_amount,
ai.trans_freq_type = ar.trans_freq_type,
ai.dr_max_single_amount = ar.dr_max_single_amount,
ai.cr_max_single_amount = ar.cr_max_single_amount,
ai.dr_max_daily_amount = ar.dr_max_daily_amount,
ai.cr_max_daily_amount = ar.cr_max_daily_amount,
ai.trans_risk_level = ar.trans_risk_level,
ai.update_by = COALESCE(ar.update_by, ai.update_by),
ai.update_time = COALESCE(ar.update_time, ai.update_time);
DROP TABLE `ccdi_account_result`;
END IF;
END//
CALL `merge_ccdi_account_result_into_info`()//
DROP PROCEDURE IF EXISTS `merge_ccdi_account_result_into_info`//
DELIMITER ;