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 ...
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Weg, der am besten funktioniert für mich war die
insert or ignore
die Werte, und dieselect
die rowid in zwei getrennten Schritten. Habe ich eineunique
Einschränkung auf diedata
Spalte sowohl beschleunigen auswählt und vermeiden Sie Duplikate.Den
select
Aussage ist nicht so langsam wie ich dachte, es wäre. Diese, es scheint, ist aufgrund SQLite automatisch erstellen einen index für dieunique
Spalten.INSERT OR IGNORE
ist für Situationen, in denen Sie kümmern sich nicht über die Identität des Datensatzes; wo das Ziel ist nur zu haben einige Datensatz mit bestimmten Wert.Wenn Sie wissen möchten, ob ein neuer Datensatz eingefügt wird oder nicht, müssen Sie von hand überprüfen:
Als für die Effizienz: wenn SQLite prüft die
data
Spalte nach Duplikaten, es hat damit zu tun, genau die gleiche Abfrage, die Sie gerade mit demSELECT
, und sobald Sie das getan haben, den Zugriff auf Pfad in den cache, also die Leistung sollte kein problem sein. In jedem Fall, es ist notwendig, führen zwei separateINSERT
/SELECT
Abfragen (entweder, um Ihre und mein code funktioniert, aber deiner ist einfacher).