fix(V41): 修复中间表优化迁移脚本(使用存储过程处理不存在的情况)

- 使用存储过程和 IF EXISTS 检查来删除索引和字段
- 避免因为索引/字段不存在导致迁移失败
- 创建临时 FlywayCleanerConfig 用于清理失败的 v41 迁移记录
- 成功执行 V41 迁移,优化中间表结构

影响范围:
- course_collection_package: 删除 uk_collection_package 索引和 deleted 字段
- tenant_course: 删除 uk_tenant_course 索引和 deleted 字段
- class_teacher: 删除 deleted 字段

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
En 2026-03-19 17:28:15 +08:00
parent 48172921d7
commit 2b611f6c17
2 changed files with 133 additions and 12 deletions

View File

@ -0,0 +1,14 @@
-- =====================================================
-- 清理 Flyway 失败的 V41 迁移记录
-- 执行时间2026-03-19
-- 说明:在执行 V41 迁移脚本之前,先清理失败的迁移记录
-- =====================================================
-- 删除 V41 的失败记录
DELETE FROM flyway_schema_history WHERE version = '41';
-- 验证清理结果
SELECT version, description, state, installed_on
FROM flyway_schema_history
ORDER BY installed_on DESC
LIMIT 10;

View File

@ -2,7 +2,7 @@
-- 迁移 V41: 中间表优化 - 移除联合唯一索引和 deleted 字段
-- 版本V41
-- 创建时间2026-03-19
-- 描述
-- 描述:
-- 1. 中间表使用物理删除,不再保留 deleted 字段
-- 2. 移除不必要的联合唯一索引,通过应用层控制数据一致性
-- 3. 适用于单体应用、低并发场景
@ -13,42 +13,149 @@
-- -----------------------------------------------------
-- 说明:纯关联表,先删后增的更新模式,不需要唯一索引兜底
-- 删除联合唯一索引MySQL 不支持 IF EXISTS直接删除
ALTER TABLE `course_collection_package` DROP INDEX `uk_collection_package`;
-- 使用存储过程删除索引(如果存在)
DROP PROCEDURE IF EXISTS drop_ccp_indexes;
DELIMITER $$
CREATE PROCEDURE drop_ccp_indexes()
BEGIN
-- 删除联合唯一索引(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE()
AND TABLE_NAME = 'course_collection_package'
AND CONSTRAINT_NAME = 'uk_collection_package') THEN
ALTER TABLE `course_collection_package` DROP INDEX `uk_collection_package`;
END IF;
-- 删除 deleted 字段
ALTER TABLE `course_collection_package` DROP COLUMN `deleted`;
-- 删除 deleted 字段(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'course_collection_package'
AND COLUMN_NAME = 'deleted') THEN
ALTER TABLE `course_collection_package` DROP COLUMN `deleted`;
END IF;
-- 添加普通索引(提高查询性能)
-- 删除普通索引(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'course_collection_package'
AND INDEX_NAME = 'idx_collection_id') THEN
ALTER TABLE `course_collection_package` DROP INDEX `idx_collection_id`;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'course_collection_package'
AND INDEX_NAME = 'idx_package_id') THEN
ALTER TABLE `course_collection_package` DROP INDEX `idx_package_id`;
END IF;
END$$
DELIMITER ;
-- 执行存储过程
CALL drop_ccp_indexes();
-- 添加普通索引
ALTER TABLE `course_collection_package`
ADD INDEX `idx_collection_id` (`collection_id`),
ADD INDEX `idx_package_id` (`package_id`);
-- 删除存储过程
DROP PROCEDURE IF EXISTS drop_ccp_indexes;
-- -----------------------------------------------------
-- 2. tenant_course租户 - 课程关联表)
-- -----------------------------------------------------
-- 说明:纯关联表,授权关系,不需要唯一索引兜底
-- 删除联合唯一索引
ALTER TABLE `tenant_course` DROP INDEX `uk_tenant_course`;
DROP PROCEDURE IF EXISTS drop_tc_indexes;
DELIMITER $$
CREATE PROCEDURE drop_tc_indexes()
BEGIN
-- 删除联合唯一索引(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE()
AND TABLE_NAME = 'tenant_course'
AND CONSTRAINT_NAME = 'uk_tenant_course') THEN
ALTER TABLE `tenant_course` DROP INDEX `uk_tenant_course`;
END IF;
-- 删除 deleted 字段
ALTER TABLE `tenant_course` DROP COLUMN `deleted`;
-- 删除 deleted 字段(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'tenant_course'
AND COLUMN_NAME = 'deleted') THEN
ALTER TABLE `tenant_course` DROP COLUMN `deleted`;
END IF;
-- 删除普通索引(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'tenant_course'
AND INDEX_NAME = 'idx_tenant_id') THEN
ALTER TABLE `tenant_course` DROP INDEX `idx_tenant_id`;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'tenant_course'
AND INDEX_NAME = 'idx_course_id') THEN
ALTER TABLE `tenant_course` DROP INDEX `idx_course_id`;
END IF;
END$$
DELIMITER ;
-- 执行存储过程
CALL drop_tc_indexes();
-- 添加普通索引
ALTER TABLE `tenant_course`
ADD INDEX `idx_tenant_id` (`tenant_id`),
ADD INDEX `idx_course_id` (`course_id`);
-- 删除存储过程
DROP PROCEDURE IF EXISTS drop_tc_indexes;
-- -----------------------------------------------------
-- 3. class_teacher班级 - 教师关联表)
-- -----------------------------------------------------
-- 说明:纯关联表,不需要 deleted 字段
-- 删除 deleted 字段
ALTER TABLE `class_teacher` DROP COLUMN `deleted`;
DROP PROCEDURE IF EXISTS drop_ct_indexes;
DELIMITER $$
CREATE PROCEDURE drop_ct_indexes()
BEGIN
-- 删除 deleted 字段(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_teacher'
AND COLUMN_NAME = 'deleted') THEN
ALTER TABLE `class_teacher` DROP COLUMN `deleted`;
END IF;
-- 删除普通索引(如果存在)
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_teacher'
AND INDEX_NAME = 'idx_class_id') THEN
ALTER TABLE `class_teacher` DROP INDEX `idx_class_id`;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'class_teacher'
AND INDEX_NAME = 'idx_teacher_id') THEN
ALTER TABLE `class_teacher` DROP INDEX `idx_teacher_id`;
END IF;
END$$
DELIMITER ;
-- 执行存储过程
CALL drop_ct_indexes();
-- 添加普通索引
ALTER TABLE `class_teacher`
ADD INDEX `idx_class_id` (`class_id`),
ADD INDEX `idx_teacher_id` (`teacher_id`);
-- 删除存储过程
DROP PROCEDURE IF EXISTS drop_ct_indexes;