插入带有唯一列的sqlite表

时间:2011-06-04 14:45:23

标签: python sqlite

我正在将值插入到我的表中(来自python代码),如下所示:

cur.execute("insert into t(a, b, c) values (?, ?, ?)", (a, b, c))

列c上有unique constraint。如果我想在为c列插入重复值时覆盖案例,insert的常用方法是什么?
我有一些想法

  1. 选择从t到列表的所有内容并在插入之前测试(如果值已经存在)
  2. try-catch block
  3. 一些更复杂的sqlite语句
  4. 你会如何测试它?

    谢谢

2 个答案:

答案 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值,所以它失败