-- ============================================================ -- 积分规则引擎升级脚本(已部署老库) -- 作用:把 member_score_rule / member_score_log 升级到规则引擎版本 -- 1) score_rule:name → title(沿用 rename_score_rule_name_to_title.sql 的判定), -- 新增 addon / limit_type / limit_times / unique_type / remark 五列 -- 2) score_log:新增 action / source / source_id 三列 + idx_rule / idx_dedup 索引 -- 适用范围:已装库。新装库由 public/install/install.sql 直接建新表,无需执行。 -- 特性: -- 1) 自动探测表前缀,匹配任意 `<前缀>_score_rule` / `<前缀>_score_log` -- 2) 幂等:列/索引存在则跳过,重命名仅在「有 name 且无 title」时执行 -- 执行: -- mysql -u -p < upgrade_score_rule_engine.sql -- ============================================================ DELIMITER // DROP PROCEDURE IF EXISTS `__mig_score_addcol`// CREATE PROCEDURE `__mig_score_addcol`(IN p_tbl VARCHAR(64), IN p_col VARCHAR(64), IN p_def VARCHAR(512)) BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_tbl AND COLUMN_NAME = p_col ) THEN SET @sql = CONCAT('ALTER TABLE `', p_tbl, '` ADD COLUMN `', p_col, '` ', p_def); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END// DROP PROCEDURE IF EXISTS `__mig_score_addindex`// CREATE PROCEDURE `__mig_score_addindex`(IN p_tbl VARCHAR(64), IN p_idx VARCHAR(64), IN p_cols VARCHAR(255)) BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_tbl AND INDEX_NAME = p_idx ) THEN SET @sql = CONCAT('ALTER TABLE `', p_tbl, '` ADD INDEX `', p_idx, '` (', p_cols, ')'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END// DROP PROCEDURE IF EXISTS `__mig_score_engine`// CREATE PROCEDURE `__mig_score_engine`() BEGIN DECLARE done INT DEFAULT 0; DECLARE tbl VARCHAR(64); DECLARE has_name INT DEFAULT 0; DECLARE has_title INT DEFAULT 0; -- ---------- 1. 规则表 ---------- BEGIN DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE '%\_score\_rule'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; rule_loop: LOOP FETCH cur INTO tbl; IF done = 1 THEN LEAVE rule_loop; END IF; SELECT COUNT(*) INTO has_name FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl AND COLUMN_NAME = 'name'; SELECT COUNT(*) INTO has_title FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tbl AND COLUMN_NAME = 'title'; IF has_name > 0 AND has_title = 0 THEN SET @sql = CONCAT( 'ALTER TABLE `', tbl, '` CHANGE COLUMN `name` `title` ', 'varchar(100) NOT NULL DEFAULT '''' COMMENT ''规则名称''' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; CALL __mig_score_addcol(tbl, 'addon', "varchar(50) NOT NULL DEFAULT '' COMMENT '归属插件标识(空=核心)'"); CALL __mig_score_addcol(tbl, 'limit_type', "tinyint(4) NOT NULL DEFAULT 0 COMMENT '限次周期 0不限1每日2每周3每月4累计'"); CALL __mig_score_addcol(tbl, 'limit_times', "int(11) NOT NULL DEFAULT 0 COMMENT '周期内最多触发次数(0=不限)'"); CALL __mig_score_addcol(tbl, 'unique_type', "tinyint(4) NOT NULL DEFAULT 0 COMMENT '去重 0不去重1按来源业务ID去重'"); CALL __mig_score_addcol(tbl, 'remark', "varchar(255) NOT NULL DEFAULT '' COMMENT '流水备注模板({title}等占位)'"); CALL __mig_score_addindex(tbl, 'idx_addon', '`addon`'); END LOOP; CLOSE cur; END; -- ---------- 2. 流水表 ---------- BEGIN DECLARE cur2 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE '%\_score\_log'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET done = 0; OPEN cur2; log_loop: LOOP FETCH cur2 INTO tbl; IF done = 1 THEN LEAVE log_loop; END IF; CALL __mig_score_addcol(tbl, 'action', "varchar(50) NOT NULL DEFAULT '' COMMENT '触发动作标识'"); CALL __mig_score_addcol(tbl, 'source', "varchar(50) NOT NULL DEFAULT '' COMMENT '来源模块/插件'"); CALL __mig_score_addcol(tbl, 'source_id', "varchar(64) NOT NULL DEFAULT '' COMMENT '来源业务ID(去重与追踪)'"); CALL __mig_score_addindex(tbl, 'idx_rule', '`rule_id`'); CALL __mig_score_addindex(tbl, 'idx_dedup', '`action`,`uid`,`source_id`'); END LOOP; CLOSE cur2; END; END// DELIMITER ; CALL __mig_score_engine(); DROP PROCEDURE IF EXISTS `__mig_score_engine`; DROP PROCEDURE IF EXISTS `__mig_score_addcol`; DROP PROCEDURE IF EXISTS `__mig_score_addindex`;