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

如何插入ID不存在的数据且无语法错误、不覆盖已有数据库记录

问题原因

你的原代码存在3个核心错误:

  • 语法错误:INSERT语句不支持同时写VALUES和SELECT两个数据来源,且VALUES列表里market_cap后面多了多余的逗号
  • 逻辑错误:WHERE条件里用单引号包裹id,相当于判断字符串'id'不等于你传入的id参数,这个条件永远为真,完全起不到判断ID是否存在的作用
  • 逻辑错误:你的SELECT是从当前coins表取数据,和你要插入新数据的需求完全不匹配

正确修改方案

SQLite场景下最简洁的写法是用INSERT OR IGNORE语法,要求你的coins表已经将id设为主键或者唯一约束,写法如下:

c.execute("""
INSERT OR IGNORE INTO coins (id, symbol, current_price, market_cap)
VALUES (:id, :symbol, :current_price, :market_cap)
""",
{
    'id': ids["id"],
    'symbol': ids["symbol"],
    'current_price': ids["current_price"],
    'market_cap': ids["market_cap"]
})

如果你的数据库不支持INSERT OR IGNORE(比如MySQL),可以用WHERE NOT EXISTS的写法实现相同逻辑:

c.execute("""
INSERT INTO coins (id, symbol, current_price, market_cap)
SELECT :id, :symbol, :current_price, :market_cap
WHERE NOT EXISTS (SELECT 1 FROM coins WHERE id = :id)
""",
{
    'id': ids["id"],
    'symbol': ids["symbol"],
    'current_price': ids["current_price"],
    'market_cap': ids["market_cap"]
})

补充说明

  • 上面两种写法都会在id已存在时直接跳过插入,不会修改原有数据,完全匹配你的需求
  • 提前确认coins表的id字段已设置为唯一约束,否则INSERT OR IGNORE无法识别重复ID

内容的提问来源于stack exchange,提问作者Nauris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:24:03