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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:14