-- 刷卡充电改造(order库):订单表新增锁定额度释放幂等标记列
|
-- 目的:
|
-- t_card_charging_order 新增 lock_released(锁定额度是否已释放:建单回滚、启动超时关单等释放路径先用
|
-- 条件更新抢占该标记,保证同一订单的企业/卡锁定额在多路径并发或重复补偿下只释放一次;
|
-- 释放失败时把标记回滚为 0,留待后续补偿或人工重试)
|
-- 创建日期: 2026-09-30
|
-- 目标库:charging_pile_order(t_card_charging_order 为分片表:TBPARTITION BY MOD_HASH(分片键) TBPARTITIONS 20)
|
-- 执行方式:
|
-- 1) 首选「小节 A」经数据库代理(MyCat 8066)执行,代理会把 DDL 广播到全部物理分表;
|
-- 2) 代理不支持分片表 DDL 时,改用「小节 B」直连后端 MySQL 实例执行(存储过程,逐物理分表,幂等);
|
-- 3) 最后执行「小节 C」回查校验。
|
-- 幂等说明:小节 A 为裸 ALTER,重复执行会报 Duplicate column,忽略即可(以小节 C 回查为准);
|
-- 小节 B 先查 information_schema 再变更,可重复执行。
|
|
-- ============ 小节 A:经代理执行(推荐) ============
|
USE `charging_pile_order`;
|
|
ALTER TABLE `t_card_charging_order`
|
ADD COLUMN `lock_released` tinyint(1) NOT NULL DEFAULT 0 COMMENT '锁定额度是否已释放(0=未释放,1=已释放;防重复释放幂等标记)';
|
|
-- ============ 小节 B:直连后端 MySQL 实例执行(代理不可用时分表执行,幂等) ============
|
USE `charging_pile_order`;
|
|
DROP PROCEDURE IF EXISTS `add_card_order_lock_released`;
|
DELIMITER $$
|
CREATE PROCEDURE `add_card_order_lock_released`()
|
BEGIN
|
DECLARE done INT DEFAULT 0;
|
DECLARE target_table VARCHAR(64);
|
DECLARE column_exists INT DEFAULT 0;
|
|
-- 覆盖逻辑表(若物理存在)与 TBPARTITION 物理分表
|
DECLARE table_cursor CURSOR FOR
|
SELECT t.table_name
|
FROM information_schema.tables t
|
WHERE t.table_schema = DATABASE()
|
AND t.table_name REGEXP '^t_card_charging_order(_[0-9]+)?$';
|
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
|
OPEN table_cursor;
|
table_loop: LOOP
|
FETCH table_cursor INTO target_table;
|
IF done = 1 THEN
|
LEAVE table_loop;
|
END IF;
|
|
SELECT COUNT(*) INTO column_exists
|
FROM information_schema.columns
|
WHERE table_schema = DATABASE()
|
AND table_name = target_table
|
AND column_name = 'lock_released';
|
IF column_exists = 0 THEN
|
SET @ddl = CONCAT('ALTER TABLE `', target_table, '` ADD COLUMN `lock_released` tinyint(1) NOT NULL DEFAULT 0 COMMENT ''锁定额度是否已释放(0=未释放,1=已释放;防重复释放幂等标记)''');
|
PREPARE stmt FROM @ddl;
|
EXECUTE stmt;
|
DEALLOCATE PREPARE stmt;
|
END IF;
|
END LOOP;
|
CLOSE table_cursor;
|
END$$
|
DELIMITER ;
|
|
CALL `add_card_order_lock_released`();
|
DROP PROCEDURE IF EXISTS `add_card_order_lock_released`;
|
|
-- ============ 小节 C:回查校验 ============
|
-- 1) 列存在性与注释(应覆盖逻辑表与全部物理分表):
|
-- SELECT table_name, column_name, column_type, column_default, column_comment
|
-- FROM information_schema.columns
|
-- WHERE table_schema = 'charging_pile_order' AND column_name = 'lock_released'
|
-- ORDER BY table_name;
|
-- 预期:t_card_charging_order 及 t_card_charging_order_0..19 均存在,
|
-- column_type=tinyint(1)、column_default=0、column_comment 中文无乱码
|
-- 2) 历史订单默认未释放:
|
-- SELECT COUNT(*) FROM t_card_charging_order WHERE lock_released = 0;
|
-- 预期:等于订单总数(存量订单全部为未释放状态,建单回滚路径可正常释放)
|