You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:04