[英]insert into sqlite table with unique column
我将值插入到我的表中(来自 python 代码),如下所示:
cur.execute("insert into t(a, b, c) values (?, ?, ?)", (a, b, c))
列 c 存在unique constraint
。 如果我想在我们为 c 列插入重复值时涵盖这种情况,那么常见的insert
方式是什么?
我有一些想法
你将如何测试它?
谢谢你
您可以使用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 可能是最有效的。
如果有多个插入器,您必须使用 2 作为低于 1 您可以测试并且看起来还可以,但是另一个插入器添加了您拥有的 C 值,因此它失败了
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.