http://en.wikipedia.org/wiki/Upsert
Insertar proceso almacenado de actualización en SQL Server
¿Hay alguna forma inteligente de hacer esto en SQLite que no haya pensado?
Básicamente quiero actualizar tres de cuatro columnas si el registro existe, si no existe quiero INSERTAR el registro con el valor predeterminado (NUL) para la cuarta columna.
La ID es una clave principal, por lo que solo habrá un registro para UPSERT.
(Estoy tratando de evitar la sobrecarga de SELECT para determinar si necesito ACTUALIZAR o INSERTAR obviamente)
Sugerencias?
No puedo confirmar esa sintaxis en el sitio SQLite para TABLE CREATE. No he creado una demostración para probarlo, pero no parece ser compatible.
Si lo fuera, tengo tres columnas, por lo que en realidad se vería así:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
pero los dos primeros blobs no causarán un conflicto, solo la ID lo haría, así que supongo que Blob1 y Blob2 no serían reemplazados (como se desea)
ACTUALIZACIONES en SQLite cuando los datos vinculantes son una transacción completa, lo que significa que cada fila enviada a actualizar requiere: Preparar / Vincular / Pasar / Finalizar declaraciones a diferencia de INSERT que permite el uso de la función de reinicio
La vida de un objeto de declaración es algo así:
- Cree el objeto usando sqlite3_prepare_v2 ()
- Vincula los valores a los parámetros del host usando las interfaces sqlite3_bind_.
- Ejecute el SQL llamando a sqlite3_step ()
- Restablezca la instrucción usando sqlite3_reset (), luego regrese al paso 2 y repita.
- Destruya el objeto de declaración usando sqlite3_finalize ().
ACTUALIZACIÓN Supongo que es lento en comparación con INSERTAR, pero ¿cómo se compara con SELECCIONAR usando la tecla Primaria?
¿Quizás debería usar select para leer la cuarta columna (Blob3) y luego usar REPLACE para escribir un nuevo registro que combine la cuarta columna original con los nuevos datos de las primeras 3 columnas?