# 修复"加入书架"数据库错误说明 ## 🔴 错误信息 ``` Unknown column 'read_progress' in 'field list' ``` ## 🔍 问题原因 数据库表 `user_bookshelf` 不存在或缺少 `read_progress` 列。 ## ✅ 解决方案 ### 方法1:在 Navicat 中执行 SQL 脚本(推荐) 1. **打开 Navicat** - 连接到你的 MySQL 数据库 - 选择 `books_db` 数据库 2. **执行修复脚本** - 打开文件:`book/src/main/resources/db/fix_bookshelf_table_mysql5.sql` - 复制脚本内容 - 在 Navicat 的查询窗口中粘贴并执行 3. **验证表结构** - 执行后,检查 `user_bookshelf` 表是否已创建 - 确认表中有以下列: - `id` - `user_id` - `book_id` - `read_progress` ✅(这是缺失的列) - `last_read_time` - `added_at` - `updated_at` ### 方法2:手动创建表(如果表不存在) 在 Navicat 中执行以下 SQL: ```sql USE `books_db`; CREATE TABLE IF NOT EXISTS `user_bookshelf` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `user_id` INT(11) NOT NULL COMMENT '用户ID', `book_id` INT(11) NOT NULL COMMENT '书籍ID', `read_progress` INT(11) DEFAULT 0 COMMENT '阅读进度(百分比)', `last_read_time` DATETIME DEFAULT NULL COMMENT '最后阅读时间', `added_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入书架时间', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_book` (`user_id`, `book_id`), KEY `idx_user_id` (`user_id`), KEY `idx_book_id` (`book_id`), KEY `idx_added_at` (`added_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户书架表'; ``` ### 方法3:如果表已存在,只添加缺失的列 如果表已存在但缺少列,执行以下 SQL(如果列已存在会报错,可以忽略): ```sql USE `books_db`; -- 添加 read_progress 列 ALTER TABLE `user_bookshelf` ADD COLUMN `read_progress` INT(11) DEFAULT 0 COMMENT '阅读进度(百分比)'; -- 添加 last_read_time 列 ALTER TABLE `user_bookshelf` ADD COLUMN `last_read_time` DATETIME DEFAULT NULL COMMENT '最后阅读时间'; -- 添加 added_at 列 ALTER TABLE `user_bookshelf` ADD COLUMN `added_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入书架时间'; -- 添加 updated_at 列 ALTER TABLE `user_bookshelf` ADD COLUMN `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'; -- 添加唯一约束 ALTER TABLE `user_bookshelf` ADD UNIQUE KEY `uk_user_book` (`user_id`, `book_id`); ``` ## 📋 执行步骤 ### 步骤1:检查表是否存在 在 Navicat 中执行: ```sql USE `books_db`; SHOW TABLES LIKE 'user_bookshelf'; ``` ### 步骤2:检查表结构 如果表存在,执行: ```sql DESC `user_bookshelf`; ``` 查看是否有 `read_progress` 列。 ### 步骤3:根据情况选择修复方法 - **如果表不存在**:使用方法1或方法2创建表 - **如果表存在但缺少列**:使用方法3添加缺失的列 - **如果表存在但结构不完整**:使用方法1删除重建(注意:会丢失数据!) ### 步骤4:验证修复 执行以下 SQL 验证表结构: ```sql DESC `user_bookshelf`; ``` 应该看到以下列: - id - user_id - book_id - read_progress ✅ - last_read_time - added_at - updated_at ### 步骤5:测试功能 1. 重启后端服务(如果正在运行) 2. 在前端点击"加入书架"按钮 3. 应该不再出现错误 ## ⚠️ 注意事项 1. **备份数据**:如果表已存在且有数据,执行删除重建操作前请先备份数据 2. **外键约束**:如果表已存在,可能需要先删除外键约束: ```sql ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_user`; ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_book`; ``` 3. **唯一约束**:如果唯一约束已存在,添加时会报错,可以忽略 ## 🔄 快速修复(推荐) 最简单的方法是在 Navicat 中执行: ```sql USE `books_db`; -- 删除旧表(如果存在) DROP TABLE IF EXISTS `user_bookshelf`; -- 创建新表 CREATE TABLE `user_bookshelf` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `user_id` INT(11) NOT NULL COMMENT '用户ID', `book_id` INT(11) NOT NULL COMMENT '书籍ID', `read_progress` INT(11) DEFAULT 0 COMMENT '阅读进度(百分比)', `last_read_time` DATETIME DEFAULT NULL COMMENT '最后阅读时间', `added_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '加入书架时间', `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_book` (`user_id`, `book_id`), KEY `idx_user_id` (`user_id`), KEY `idx_book_id` (`book_id`), KEY `idx_added_at` (`added_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户书架表'; ``` 执行后,重新测试"加入书架"功能即可。