我正在将值插入到我的表中(来自python代码),如下所示:
cur.execute("insert into t(a, b, c) values (?, ?, ?)", (a, b, c))
列c上有unique constraint
。如果我想在为c列插入重复值时覆盖案例,insert
的常用方法是什么?
我有一些想法
你会如何测试它?
谢谢
答案 0 :(得分:13)
您可以使用INSERT OR REPLACE更新具有唯一约束的行, 或INSERT OR IGNORE忽略与唯一约束冲突的插入:
import sqlite3
def insert_or_replace():
# https://sqlite.org/lang_insert.html
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('CREATE TABLE foo (bar INTEGER UNIQUE, baz INTEGER)')
cursor.execute('INSERT INTO foo (bar,baz) VALUES (?, ?)',(1,2))
cursor.execute('INSERT OR REPLACE INTO foo (bar,baz) VALUES (?, ?)',(1,3))
cursor.execute('SELECT * from foo')
data=cursor.fetchall()
print(data)
# [(1, 3)]
def on_conflict():
# https://sqlite.org/lang_insert.html
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('CREATE TABLE foo (bar INTEGER UNIQUE, baz INTEGER)')
cursor.execute('INSERT INTO foo (bar,baz) VALUES (?, ?)',(1,2))
cursor.execute('INSERT OR IGNORE INTO foo (bar,baz) VALUES (?, ?)',(1,3))
cursor.execute('SELECT * from foo')
data=cursor.fetchall()
print(data)
# [(1, 2)]
insert_or_replace()
on_conflict()
这些sqlite命令可能比编写Python代码更快地执行相同的操作,但为了测试这一点,您可以使用Python的timeit
模块来测试各种实现的速度。例如,您可以运行
python -mtimeit -s'import test' 'test.insert_or_replace()'
与
python -mtimeit -s'import test' 'test.filter_nonunique_rows_in_Python()'
与
python -mtimeit -s'import test' 'test.insert_with_try_catch_blocks()'
答案 1 :(得分:1)
取决于:)
如果只有一个插入器,则1可能效率最高。
如果有几个插入器,你必须使用2作为1以下你可以测试,看起来没问题,但另一个插入器添加你有的C值,所以它失败