Python SQLite实现不存在则插入数据的方法问询
解决SQLite中INSERT IF NOT EXISTS不生效的问题
首先得明确两个核心原因导致你的语句失效:SQLite本身不支持INSERT IF NOT EXISTS这种语法,而且你的place表没有定义唯一约束,数据库根本没法判断“特定条目是否重复”。下面是具体的解决步骤:
1. 给表添加唯一约束(关键前提)
你提到想以name作为判断重复的依据,那我们需要给name字段添加唯一约束,让数据库把重复的name识别为冲突。
如果表已经创建完成,执行这条SQL修改结构:
ALTER TABLE place ADD CONSTRAINT unique_place_name UNIQUE (name);
如果是重新创建表,直接在创建语句里加入UNIQUE约束:
command_create_table = """ CREATE TABLE if not exists place ( name VARCHAR(100) UNIQUE, lat DOUBLE(100, 10), lng DOUBLE(100,10), vicinity VARCHAR(100), typeOfPlace VARCHAR(100) ); """
2. 使用SQLite支持的“无则插入,有则忽略”语法
现在有两种可靠的写法,你可以根据SQLite版本选择:
方式一:INSERT OR IGNORE(兼容所有SQLite版本)
这是最通用的写法,当插入操作违反唯一约束时,会直接忽略这条请求:
cursor.execute(""" INSERT OR IGNORE INTO place (name, lat, lng, vicinity, typeOfPlace) VALUES (?, ?, ?, ?, ?) """, (name, lat, lng, vicinity, typeOfPlace))
方式二:INSERT ... ON CONFLICT ... DO NOTHING(SQLite 3.24.0+推荐)
这种写法可读性更强,明确指定当name字段冲突时不执行任何操作:
cursor.execute(""" INSERT INTO place (name, lat, lng, vicinity, typeOfPlace) VALUES (?, ?, ?, ?, ?) ON CONFLICT(name) DO NOTHING """, (name, lat, lng, vicinity, typeOfPlace))
补充:多字段组合判断重复
如果你的“特定条目”需要多个字段组合判断(比如name+lat+lng同时重复才算同一条目),只需要把唯一约束改成组合约束即可:
ALTER TABLE place ADD CONSTRAINT unique_place_key UNIQUE (name, lat, lng);
对应的插入语句里,ON CONFLICT后面改成(name, lat, lng)就行。
内容的提问来源于stack exchange,提问作者nad
相关产品推荐
相关产品推荐

