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

146 lines
5.5 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_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 ;