library-picturebook-activity/backend/sql/competition_fixes.md
2025-11-23 14:04:20 +08:00

8.0 KiB
Raw Blame History

赛事管理 SQL 文件修复清单

⚠️ 需要修复的问题

1. 删除重复的表定义

问题位置: 第125-144行
问题描述: t_contest_work_score 表被定义了两次第104-123行和第125-144行
修复方案: 删除第125-144行的重复定义

-- 删除以下重复定义第125-144行
CREATE TABLE `t_contest_work_score` (
  `id` varchar(63) NOT NULL COMMENT '主键id',
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作品评分表';

2. 修复表定义语法错误

问题位置: 第102行
问题描述: t_contest_work_attachment 表定义末尾有多余的逗号
修复方案: 删除第101行末尾的逗号

-- 第101行删除末尾逗号
KEY `idx_work_file` (`tenant_key`,`contest_id`,`work_id`),  -- ❌ 错误:末尾有逗号
KEY `idx_work_file` (`tenant_key`,`contest_id`,`work_id`)   -- ✅ 正确:删除逗号

3. 修复索引字段名错误

问题位置: 第183行
问题描述: t_contest_team 表的唯一索引引用了不存在的字段 name,实际字段名是 team_name
修复方案: 将索引字段名改为 team_name

-- 第183行修改前
UNIQUE KEY `uk_team_name` (`tenant_key`,`contest_id`,`name`),  -- ❌ 错误:字段名错误

-- 修改后:
UNIQUE KEY `uk_team_name` (`tenant_key`,`contest_id`,`team_name`),  -- ✅ 正确

4. 修复索引字段不存在错误

问题位置: 第82行
问题描述: t_contest_work 表的索引 idx_submit_filter 引用了不存在的字段 review_status
修复方案: 删除该索引或修改为存在的字段

-- 第82行修改前
KEY `idx_submit_filter` (`tenant_key`,`contest_id`,`submit_time`,`review_status`)  -- ❌ 错误review_status 字段不存在

-- 修改方案1删除该索引如果不需要
-- 直接删除这一行

-- 修改方案2修改为存在的字段如果需要该索引
KEY `idx_submit_filter` (`tenant_key`,`contest_id`,`submit_time`,`status`)  -- ✅ 使用 status 字段

📝 修复后的完整 SQL关键部分

t_contest_work_attachment 表(修复后)

CREATE TABLE `t_contest_work_attachment` (
  `id` varchar(63) NOT NULL COMMENT '主键id',
  `tenant_key` varchar(127) NOT NULL COMMENT '所属租户键',
  `contest_id` varchar(63) NOT NULL COMMENT '赛事id',
  `work_id` varchar(63) NOT NULL COMMENT '作品id',
  `file_name` varchar(255) NOT NULL COMMENT '文件名',
  `file_url` varchar(255) NOT NULL COMMENT '文件路径',
  `format` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件类型png,mp4',
  `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '素材类型image,video',
  `size` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '文件大小',
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人',
  `modifier` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  KEY `idx_work_file` (`tenant_key`,`contest_id`,`work_id`)  -- ✅ 已删除末尾逗号
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作品附件文件表';

t_contest_work 表(修复后)

CREATE TABLE `t_contest_work` (
  `id` varchar(63) NOT NULL COMMENT '主键id',
  `tenant_key` varchar(127) NOT NULL COMMENT '作品所属租户键',
  `contest_id` varchar(63) NOT NULL COMMENT '赛事id',
  `entry_id` varchar(63) NOT NULL COMMENT '参赛报名实体id',
  `work_no` varchar(63) DEFAULT NULL COMMENT '作品编号(展示用唯一编号)',
  `title` varchar(255) NOT NULL COMMENT '作品标题',
  `description` text DEFAULT NULL COMMENT '作品说明',
  `files` json DEFAULT NULL COMMENT '作品文件列表(简易场景)',
  `version` int NOT NULL DEFAULT 1 COMMENT '作品版本号(递增)',
  `is_latest` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否最新版本1是/0否',
  `status` varchar(31) NOT NULL DEFAULT 'submitted' COMMENT '作品状态submitted/locked/reviewing/rejected/accepted',
  `submit_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间',
  `submitter_user_id` varchar(63) DEFAULT NULL COMMENT '提交人用户id',
  `submitter_account_no` varchar(127) DEFAULT NULL COMMENT '提交人账号(手机号/学号)',
  `submit_source` varchar(31) NOT NULL DEFAULT 'teacher' COMMENT '提交来源teacher/student/team_leader',
  `preview_url` varchar(255) DEFAULT NULL COMMENT '作品预览URL3D/视频)',
  `ai_model_meta` json DEFAULT NULL COMMENT 'AI建模元数据模型类型、版本、参数',
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人',
  `modifier` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `valid_state` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '有效状态1-有效2-失效)',

  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_work_no` (`work_no`),
  KEY `idx_work_contest_latest` (`tenant_key`,`contest_id`,`is_latest`),
  KEY `idx_work_entry` (`entry_id`),
  KEY `idx_submit_filter` (`tenant_key`,`contest_id`,`submit_time`,`status`)  -- ✅ 已修复:使用 status 字段
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='参赛作品';

t_contest_team 表(修复后)

CREATE TABLE `t_contest_team` (
  `id` varchar(63) NOT NULL COMMENT '主键id',
  `tenant_key` varchar(127) NOT NULL COMMENT '团队所属租户键',
  `contest_id` varchar(63) NOT NULL COMMENT '赛事id',
  `team_name` varchar(127) NOT NULL COMMENT '团队名称(租户内唯一)',
  `leader_account_id` varchar(63) NOT NULL COMMENT '团队负责人用户id',
  `max_members` int DEFAULT NULL COMMENT '团队最大成员数',
  `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '创建人',
  `modifier` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `valid_state` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '有效状态1-有效2-失效)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_team_name` (`tenant_key`,`contest_id`,`team_name`),  -- ✅ 已修复:使用 team_name 字段
  KEY `idx_contest` (`contest_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='赛事团队';

🔍 验证步骤

修复完成后,请执行以下验证:

  1. 语法检查

    # 使用 MySQL 客户端检查语法
    mysql -u root -p < competition.sql
    
  2. 表结构验证

    -- 检查表是否存在
    SHOW TABLES LIKE 't_contest%';
    
    -- 检查表结构
    DESCRIBE t_contest_work;
    DESCRIBE t_contest_work_attachment;
    DESCRIBE t_contest_team;
    DESCRIBE t_contest_work_score;
    
  3. 索引验证

    -- 检查索引是否正确
    SHOW INDEX FROM t_contest_work;
    SHOW INDEX FROM t_contest_team;
    

📌 建议

在修复 SQL 文件后,建议:

  1. 创建数据库迁移文件:使用 Prisma Migrate 或手动创建迁移
  2. 更新 Prisma Schema:将修复后的表结构同步到 schema.prisma
  3. 测试数据插入:插入测试数据验证表结构正确性
  4. 备份数据库:在执行迁移前备份现有数据