修复书架表错误说明.md 5.0 KB

修复"加入书架"数据库错误说明

🔴 错误信息

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:

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(如果列已存在会报错,可以忽略):

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 中执行:

USE `books_db`;
SHOW TABLES LIKE 'user_bookshelf';

步骤2:检查表结构

如果表存在,执行:

DESC `user_bookshelf`;

查看是否有 read_progress 列。

步骤3:根据情况选择修复方法

  • 如果表不存在:使用方法1或方法2创建表
  • 如果表存在但缺少列:使用方法3添加缺失的列
  • 如果表存在但结构不完整:使用方法1删除重建(注意:会丢失数据!)

步骤4:验证修复

执行以下 SQL 验证表结构:

DESC `user_bookshelf`;

应该看到以下列:

  • id
  • user_id
  • book_id
  • read_progress ✅
  • last_read_time
  • added_at
  • updated_at

步骤5:测试功能

  1. 重启后端服务(如果正在运行)
  2. 在前端点击"加入书架"按钮
  3. 应该不再出现错误

⚠️ 注意事项

  1. 备份数据:如果表已存在且有数据,执行删除重建操作前请先备份数据

  2. 外键约束:如果表已存在,可能需要先删除外键约束:

    ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_user`;
    ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_book`;
    
  3. 唯一约束:如果唯一约束已存在,添加时会报错,可以忽略

🔄 快速修复(推荐)

最简单的方法是在 Navicat 中执行:

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='用户书架表';

执行后,重新测试"加入书架"功能即可。