SQL使用CONCAT函数追加新章节时旧数据丢失问题如何解决
问题根因
你现有代码的核心错误是UPDATE赋值时没有保留chapters字段的原有内容,直接用拼接的「前一章节+新章节」字符串覆盖了整个字段值,因此旧章节全部丢失。
修复代码
修改后的逻辑先做存在性校验,再通过字符串替换将新章节插入到指定位置,同时使用参数化查询避免SQL注入风险:
def soo(chap_number, manga_id): # 先查询现有章节列表,校验目标章节是否已存在 cursor.execute("SELECT chapters FROM crawler WHERE manga_id = %s", (manga_id,)) current_chapters = cursor.fetchone()[0] target_chap_flag = f"Chapter {chap_number}" if target_chap_flag in current_chapters: print(f"章节{chap_number}已存在,无需重复插入") return # 字符串替换实现插入:将前一章节的字符串替换为「前一章节, 新章节」 update_sql = """ UPDATE crawler SET chapters = REPLACE(chapters, %s, %s) WHERE manga_id = %s """ old_segment = f"Chapter {chap_number - 1}" new_segment = f"Chapter {chap_number - 1}, Chapter {chap_number}" cursor.execute(update_sql, (old_segment, new_segment, manga_id)) data.commit() print(f"章节{chap_number}插入成功")
优化建议
- 如果需要插入的章节是当前最大章节+1,不需要用REPLACE,直接用
CONCAT(chapters, ', Chapter {chap_number}')拼到原有字符串末尾即可,执行效率更高 - 长期更推荐的方案:不要将多章节结构化数据存储为单个字符串字段,单独建
manga_chapters表,字段包含manga_id、chapter_num、chapter_info等,后续增删改查章节无需处理复杂字符串逻辑,可维护性和性能提升非常明显。
内容的提问来源于stack exchange,提问作者urek mazino
相关产品推荐
相关产品推荐

