如何插入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
相关产品推荐
相关产品推荐

