如何在Python中替换SQLite数据库内已存在的数据?
问题解决:SQLite INSERT OR REPLACE 不替换反而新增数据
你的问题根源在于当前的STUDENT表没有定义唯一约束(主键或唯一索引)。SQLite的INSERT OR REPLACE语句只有在插入的记录触发唯一约束冲突时,才会替换原有记录;如果没有任何唯一约束,数据库无法判断哪条记录是“已存在”的,所以每次都会执行新增操作。
解决方案步骤
1. 给表添加唯一约束
你需要根据业务逻辑,为表设置主键或唯一索引。比如假设NAME字段是唯一的(每个学生名字不重复),可以把NAME设为主键;如果是组合字段唯一(比如NAME+CLASS+SECTION),可以设置联合唯一约束。
以下是修改后的表创建语句,以NAME作为主键为例:
table ="""CREATE TABLE IF NOT EXISTS STUDENT( NAME VARCHAR(255) PRIMARY KEY, CLASS VARCHAR(255), SECTION VARCHAR(255) );"""
如果需要联合唯一约束(比如同一个班级和section里名字唯一),可以这样定义:
table ="""CREATE TABLE IF NOT EXISTS STUDENT( NAME VARCHAR(255), CLASS VARCHAR(255), SECTION VARCHAR(255), UNIQUE(NAME, CLASS, SECTION) );"""
2. 验证替换效果
修改表结构后,当你再次执行INSERT OR REPLACE时,若插入的记录与现有记录的唯一约束字段值相同,就会替换原有记录。比如:
先插入一条记录:
cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES (?,?,?)''',("ravi", "12", "b"))
再执行一次相同NAME但不同section的插入:
cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES (?,?,?)''',("ravi", "12", "A"))
这时候数据库里只会保留('ravi', '12', 'A')这条记录,原来的('ravi', '12', 'b')会被替换。
完整修改后的代码
import sqlite3 name = "ravi" std = "12" sec = "b" conn = sqlite3.connect('sample.db') cursor = conn.cursor() # 创建带主键的表 table ="""CREATE TABLE IF NOT EXISTS STUDENT( NAME VARCHAR(255) PRIMARY KEY, CLASS VARCHAR(255), SECTION VARCHAR(255) );""" cursor.execute(table) # 执行插入/替换操作 cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES (?,?,?)''',(name,std,sec)) # 再次插入相同name但不同section的记录,会替换原有数据 cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES ('ravi', '12', 'A')''') cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES ('Shyam', '8th', 'B')''') cursor.execute('''INSERT OR REPLACE INTO STUDENT VALUES ('Baburao', '9th', 'C')''') # 查看结果 print("Data in the table: ") data=cursor.execute('''SELECT * FROM STUDENT''') for row in data: print(row) conn.commit() conn.close()
执行后你会发现,ravi的记录只有最新的那条,不会重复新增。
内容的提问来源于stack exchange,提问作者DarkStar
相关产品推荐
相关产品推荐

