私はSQLiteのドキュメント、スタックオーバーフローに関するさまざまな質問と回答、およびこのことを読むのに時間を費やしましたが、完全な回答には至っていません。
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
行をテーブルに挿入して行IDを返す、または行が既に存在する場合は無視して行IDを取得するための最良の(読み取り:最も効率的な)方法は何ですか? これは非常に頻繁に発生するため、効率が重要です。
INSERT OR IGNORE
無視された行が比較された行の行 ID を返す方法はありますか? 挿入と同じくらい効率的であるため、これは素晴らしいことです。