146 lines
5.5 KiB
SQL
146 lines
5.5 KiB
SQL
-- 拆分账户信息表:账户基础信息保留在 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 ;
|