diff --git a/reading-platform-java/clean-flyway-v41.sql b/reading-platform-java/clean-flyway-v41.sql new file mode 100644 index 0000000..6a8f695 --- /dev/null +++ b/reading-platform-java/clean-flyway-v41.sql @@ -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; diff --git a/reading-platform-java/src/main/resources/db/migration/V41__optimize_association_tables.sql b/reading-platform-java/src/main/resources/db/migration/V41__optimize_association_tables.sql index 7d6d384..0e8e843 100644 --- a/reading-platform-java/src/main/resources/db/migration/V41__optimize_association_tables.sql +++ b/reading-platform-java/src/main/resources/db/migration/V41__optimize_association_tables.sql @@ -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;