繁体   English   中英

插入具有唯一列的 sqlite 表

[英]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方式是什么?
我有一些想法

  1. select 从 t 到列表的所有内容,如果值已经存在,则在插入之前进行测试
  2. try-catch 块
  3. 一些更复杂的 sqlite 语句

你将如何测试它?

谢谢你

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM