Ich habe einen Prozess, wo ich irgendwann eine neue Spalte zu einer Tabelle vom Typ INTEGER hinzufügen musste, dann musste ich diese neue Spalte mit einem UPDATE füllen. Ich tue dies in C.sqlite optimales Update nach einer alter table add
Ich kann meinen Code
CREATE table t (a integer, b integer)
populate t
CREATE INDEX t_ndx on t (a)
ALTER TABLE t add c integer
Der C Pseudo-Code der Spalte 'c' so aussehen zu aktualisieren beuge mich
sqlite3_stmt u;
sqlite3_prepare_v2(db, "update t set c=? where a=?, -1, &u, 0);
for(i=0;i<n;i++)
{ c=c_a[i];
a=a_a[i];
sqlite3_bind_int64(u, 1, c);
sqlite3_bind_int64(u, 1, a);
sqlite3_step(u);
}
Die Reihenfolge der A sind das gleiche für dieses UPDATE wie das, das beim Erstellen von t angegeben wurde.
Ich würde gerne wissen, ob die sqlite3-Engine den "sequenziellen" Zugriff erkennt und das "where a =?" (dh eine Art Caching des vorherigen Cursors beibehalten?
Ich würde auch gerne wissen, ob es "versteckte" Funktion wie bindende Arrays gibt (zumindest wenn es sich um INTEGER handelt), um eine solche Schleife zu konstruieren und alles zu vermeiden diese Bindungen und vermeiden den Bytecode zu tun alle, fügen etwas entlang der Linie von
sqlite3_stmt u;
sqlite3_prepare_v2(db, "update t set c=? where a=?, -1, &u, 0);
sqlite3_bind_int64_array(u, 1, c_a, n);
sqlite3_bind_int64_array(u, 1, a_a, n);
sqlite3_step_array(u,n);
Danke im Voraus Prost Phi
Danke CL für Ihre Antwort, ich werde das CASE-Beispiel für eine andere Situation behalten, die ich bekommen habe. Ich habe einen INDEX auf 'a' erstellt, in der Hoffnung, dass es die WHERE a =? Beschleunigen wird, ich dachte, es würde den Scan erleichtern, aber der =? Reihenfolge werde ich genau die Zeilenreihenfolge in 't' liefern, könnte ich dann den Scan von Rowid erzwingen, wenn der Scan von Rowid ist schneller als der Scan von Index auf Col 'a'. Ich kenne die Interna von sqlite3 nicht. Nochmals Danke. Phi – Phi