SQLite insert-oder ignorieren und zurückkehren original _rowid_

Habe ich verbrachte einige Zeit mit dem Lesen der SQLite docs, verschiedene Fragen und Antworten hier auf Stack Overflow und dieses Ding, aber nicht eine vollständige Antwort.

Ich weiß, dass es keine Möglichkeit gibt, etwas zu tun, wie INSERT OR IGNORE INTO foo VALUES(...) mit SQLite und wieder die rowid der ursprünglichen Reihe, und dass die nächste wäre INSERT OR REPLACE aber, die löscht die ganze Zeile und fügt eine neue Zeile und erhält so eine neue rowid.

Beispiel-Tabelle:

CREATE TABLE foo(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    data TEXT
);

Ich jetzt tun kann:

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]

Aber etwas, das ideal Aussehen würde:

the_id_of_the_row = sql.execute("INSERT OR IGNORE foo(data) VALUES(?)", ("Some text", )).lastrowid

Was ist der beste (lies: die effizienteste) Möglichkeit zum einfügen einer Zeile in eine Tabelle und die Rückgabe der rowid, oder zu ignorieren, die Zeile, wenn Sie bereits vorhanden ist, und bekomme nur die rowid? Effizienz ist wichtig, weil das passiert ziemlich oft.

Ist es ein Weg, um INSERT OR IGNORE und wieder die rowid der Zeile, die der Zeile ignoriert wurde verglichen? Das wäre toll, wie es wäre genauso effizient wie eine einfügen.

  • Haben Sie versucht, die UPDATE ... WHERE ...?
InformationsquelleAutor Whymarrh | 2012-11-06
Schreibe einen Kommentar