我正在将值插入到我的表中(来自python代码),如下所示:
cur.execute("insert into t(a, b, c) values (?, ?, ?)", (a, b, c))
unique constraint列c上有一个.insert当我们为c列插入重复值时,如果我想覆盖这种情况,常见的方法是什么?
我有一些想法
你会如何测试它?
谢谢
unu*_*tbu 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()'
| 归档时间: | 
 | 
| 查看次数: | 7908 次 | 
| 最近记录: |