Files
ccdi/sql/migration/2026-04-10-split-ccdi-account-info.sql

146 lines
5.5 KiB
MySQL
Raw Normal View History

-- 拆分账户信息表:账户基础信息保留在 ccdi_account_info动态交易画像迁移到 ccdi_account_result。
-- 执行说明:涉及中文内容时请使用 bin/mysql_utf8_exec.sh 执行,确保会话字符集为 utf8mb4。
CREATE TABLE IF NOT EXISTS `ccdi_account_result` (
`result_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键,唯一标识',
`account_no` VARCHAR(240) NOT NULL COMMENT '账户号码(加密存储)',
`is_self_account` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否本人实控账户0-否 1-是',
`monthly_avg_trans_count` INT DEFAULT 0 COMMENT '近6个月平均交易笔数',
`monthly_avg_trans_amount` DECIMAL(18,2) DEFAULT 0.00 COMMENT '近6个月平均交易金额',
`trans_freq_type` VARCHAR(20) DEFAULT 'MEDIUM' COMMENT 'LOW:低频, MEDIUM:中频, HIGH:高频',
`dr_max_single_amount` DECIMAL(18,2) COMMENT '借方单笔交易最高额',
`cr_max_single_amount` DECIMAL(18,2) COMMENT '贷方单笔交易最高额',
`dr_max_daily_amount` DECIMAL(18,2) COMMENT '借方日累计交易最高额',
`cr_max_daily_amount` DECIMAL(18,2) COMMENT '贷方日累计交易最高额',
`trans_risk_level` VARCHAR(10) DEFAULT 'LOW' COMMENT '交易风险等级',
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`result_id`),
UNIQUE KEY `uk_ccdi_account_result_account_no` (`account_no`),
KEY `idx_ccdi_account_result_risk_level` (`trans_risk_level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账户结果表';
DELIMITER //
DROP PROCEDURE IF EXISTS `migrate_ccdi_account_info_split`//
CREATE PROCEDURE `migrate_ccdi_account_info_split`()
BEGIN
DECLARE dynamic_column_count INT DEFAULT 0;
SELECT COUNT(*)
INTO dynamic_column_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'ccdi_account_info'
AND COLUMN_NAME IN (
'is_self_account',
'monthly_avg_trans_count',
'monthly_avg_trans_amount',
'trans_freq_type',
'dr_max_single_amount',
'cr_max_single_amount',
'dr_max_daily_amount',
'cr_max_daily_amount',
'trans_risk_level'
);
IF dynamic_column_count = 9 THEN
INSERT INTO `ccdi_account_result` (
`account_no`,
`is_self_account`,
`monthly_avg_trans_count`,
`monthly_avg_trans_amount`,
`trans_freq_type`,
`dr_max_single_amount`,
`cr_max_single_amount`,
`dr_max_daily_amount`,
`cr_max_daily_amount`,
`trans_risk_level`,
`create_by`,
`create_time`,
`update_by`,
`update_time`
)
SELECT
`account_no`,
COALESCE(`is_self_account`, 1),
COALESCE(CAST(`monthly_avg_trans_count` AS SIGNED), 0),
COALESCE(`monthly_avg_trans_amount`, 0.00),
COALESCE(`trans_freq_type`, 'MEDIUM'),
`dr_max_single_amount`,
`cr_max_single_amount`,
`dr_max_daily_amount`,
`cr_max_daily_amount`,
COALESCE(`trans_risk_level`, 'LOW'),
`create_by`,
COALESCE(`create_time`, CURRENT_TIMESTAMP),
`update_by`,
COALESCE(`update_time`, CURRENT_TIMESTAMP)
FROM `ccdi_account_info`
ON DUPLICATE KEY UPDATE
`is_self_account` = VALUES(`is_self_account`),
`monthly_avg_trans_count` = VALUES(`monthly_avg_trans_count`),
`monthly_avg_trans_amount` = VALUES(`monthly_avg_trans_amount`),
`trans_freq_type` = VALUES(`trans_freq_type`),
`dr_max_single_amount` = VALUES(`dr_max_single_amount`),
`cr_max_single_amount` = VALUES(`cr_max_single_amount`),
`dr_max_daily_amount` = VALUES(`dr_max_daily_amount`),
`cr_max_daily_amount` = VALUES(`cr_max_daily_amount`),
`trans_risk_level` = VALUES(`trans_risk_level`),
`update_by` = VALUES(`update_by`),
`update_time` = VALUES(`update_time`);
ALTER TABLE `ccdi_account_info`
DROP COLUMN `is_self_account`,
DROP COLUMN `monthly_avg_trans_count`,
DROP COLUMN `monthly_avg_trans_amount`,
DROP COLUMN `trans_freq_type`,
DROP COLUMN `dr_max_single_amount`,
DROP COLUMN `cr_max_single_amount`,
DROP COLUMN `dr_max_daily_amount`,
DROP COLUMN `cr_max_daily_amount`,
DROP COLUMN `trans_risk_level`;
ELSEIF dynamic_column_count <> 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'ccdi_account_info dynamic columns are partially migrated; please check schema before running this migration.';
END IF;
END//
CALL `migrate_ccdi_account_info_split`()//
DROP PROCEDURE IF EXISTS `migrate_ccdi_account_info_split`//
DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS `add_ccdi_account_info_bank_scope`//
CREATE PROCEDURE `add_ccdi_account_info_bank_scope`()
BEGIN
DECLARE column_count INT DEFAULT 0;
SELECT COUNT(*)
INTO column_count
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'ccdi_account_info'
AND COLUMN_NAME = 'bank_scope';
IF column_count = 0 THEN
ALTER TABLE `ccdi_account_info`
ADD COLUMN `bank_scope` VARCHAR(20) NOT NULL DEFAULT 'INTERNAL' COMMENT '账户范围INTERNAL-行内EXTERNAL-行外'
AFTER `account_type`;
END IF;
UPDATE `ccdi_account_info`
SET `bank_scope` = 'INTERNAL'
WHERE `bank_scope` IS NULL
OR `bank_scope` = '';
END//
CALL `add_ccdi_account_info_bank_scope`()//
DROP PROCEDURE IF EXISTS `add_ccdi_account_info_bank_scope`//
DELIMITER ;