我花了一些时间阅读 SQLite文档、Stack Overflow 上的各种问题和答案,以及这件事,但还没有得到完整的答案。
我知道没有办法INSERT OR IGNORE INTO foo VALUES(...)
用 SQLite 做类似的事情并取回原始行的 rowid ,最接近它的方法是INSERT OR REPLACE
删除整行并插入新行,从而获得新的 rowid。
示例表:
CREATE TABLE foo(
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT
);
现在我可以这样做:
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]
但理想的东西看起来像:
the_id_of_the_row = sql.execute("INSERT OR IGNORE foo(data) VALUES(?)", ("Some text", )).lastrowid
将行插入表并返回 rowid 的最佳(阅读:最有效)方法是什么,或者如果该行已经存在则忽略该行并仅获取 rowid?效率很重要,因为这会经常发生。
有没有办法INSERT OR IGNORE
返回与被忽略行进行比较的行的rowid?这会很棒,因为它和插入一样有效。