我花了一些时间在Stack Overflow上阅读SQLite 文档,各种问题和答案,以及这件事,但还没有得到完整答案.
我知道没有办法做类似于INSERT OR IGNORE INTO foo VALUES(...)
SQLite的事情并且返回原始行的rowid,并且最接近它的是INSERT OR REPLACE
但是删除整行并插入一个新行,从而得到一个新的rowid.
示例表:
CREATE TABLE foo(
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT
);
Run Code Online (Sandbox Code Playgroud)
现在我可以这样做:
sql = sqlite3.connect(":memory:")
# create database
sql.execute("INSERT OR IGNORE INTO foo(data) VALUES(?);", ("Some text.", ))
the_id_of_the_row = None
for row in sql.execute("SELECT id FROM foo WHERE data = ?", ("Some text.", )):
the_id_of_the_row = row[0]
Run Code Online (Sandbox Code Playgroud)
但理想的东西看起来像:
the_id_of_the_row = sql.execute("INSERT OR IGNORE foo(data) VALUES(?)", ("Some text", )).lastrowid
Run Code Online (Sandbox Code Playgroud)
将行插入表并返回rowid的最佳(读取:最有效)方法是什么,或者如果已存在并且只获取rowid则忽略该行?效率很重要,因为这种情况会经常发生.
有没有办法INSERT OR IGNORE
和返回被忽略的行被比较的行的rowid?这将是很好的,因为它与插入一样有效.
对我来说最好的方法是对insert or ignore
值,以及select
两个单独步骤中的rowid.我unique
在data
列上使用了一个约束来加速选择并避免重复.
sql.execute("INSERT OR IGNORE INTO foo(data) VALUES(?);" ("Some text.", ))
last_row_id = sql.execute("SELECT id FROM foo WHERE data = ?;" ("Some text. ", ))
Run Code Online (Sandbox Code Playgroud)
该select
声明是不一样慢,因为我认为这将是.这似乎是由于SQLite自动为unique
列创建索引.