Unknown column 'read_progress' in 'field list'
数据库表 user_bookshelf 不存在或缺少 read_progress 列。
打开 Navicat
books_db 数据库执行修复脚本
book/src/main/resources/db/fix_bookshelf_table_mysql5.sql验证表结构
user_bookshelf 表是否已创建iduser_idbook_idread_progress ✅(这是缺失的列)last_read_timeadded_atupdated_at在 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='用户书架表';
如果表已存在但缺少列,执行以下 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`);
在 Navicat 中执行:
USE `books_db`;
SHOW TABLES LIKE 'user_bookshelf';
如果表存在,执行:
DESC `user_bookshelf`;
查看是否有 read_progress 列。
执行以下 SQL 验证表结构:
DESC `user_bookshelf`;
应该看到以下列:
备份数据:如果表已存在且有数据,执行删除重建操作前请先备份数据
外键约束:如果表已存在,可能需要先删除外键约束:
ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_user`;
ALTER TABLE `user_bookshelf` DROP FOREIGN KEY `fk_bookshelf_book`;
唯一约束:如果唯一约束已存在,添加时会报错,可以忽略
最简单的方法是在 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='用户书架表';
执行后,重新测试"加入书架"功能即可。