SQLite插入或忽略并返回原始_rowid_

Why*_*rrh 13 python sqlite

我花了一些时间在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?这将是很好的,因为它与插入一样有效.

Why*_*rrh 9

对我来说最好的方法是对insert or ignore值,以及select两个单独步骤中的rowid.我uniquedata列上使用了一个约束来加速选择并避免重复.

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列创建索引.