SQLite docs、Stack Overflowに関するさまざまな質問と回答、およびthis thingを読んでいましたが、完全な答えが得られていません。SQLiteの挿入または無視元_rowid_
私はSQLiteのでINSERT OR IGNORE INTO foo VALUES(...)
ような何かを行うと、元の行のROWIDを取り戻す方法がないこと、およびそれに最も近いINSERT OR REPLACE
になることを知っているが、それは、行全体を削除し、新しい行を挿入し、新しいローIDを取得します。
例テーブル:
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を返すか、私は行を無視するtはすでに存在し、単にROWIDを取得しますか?これは非常に頻繁に起こるため、効率性は重要です。
INSERT OR IGNORE
には、無視された行が比較された行のROWIDが返されますか?これは、挿入と同じくらい効率的であるため、これは素晴らしいことです。
「UPDATE ... WHERE ...」を試しましたか? – Keith