not - SQLite "INSERT O REPLACE INTO" contra "UPDATE... WHERE"
upsert oracle (4)
Nunca he visto la sintaxis INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")
utilizados en SQL anteriormente, y me preguntaba por qué es mejor que los UPDATE names SET name = "John" WHERE id = 1
. ¿Hay alguna buena razón para usar una sobre la otra? ¿Es esta sintaxis específica para SQLite?
ACTUALIZAR no hará nada si la fila no existe.
Donde, como INSERTAR O REEMPLAZAR insertaría si la fila no existe, o reemplazar los valores si lo hace.
Actualmente estoy trabajando en una declaración de este tipo y descubrí otro hecho para notar: INSERTAR O SUSTITUIR reemplazará cualquier valor que no esté incluido en la declaración. Por ejemplo, si su tabla contiene una columna "apellido" para la que no proporcionó un valor, INSERTAR O REEMPLAZAR anulará el "apellido" si es posible (las restricciones lo permiten) o si falla.
La consulta de inserción o reemplazo insertaría un nuevo registro si id = 1 aún no existe.
La consulta de actualización solo superará a id = 1 si ya existe, no crearía un nuevo registro si no existiera.
REPLACE INTO table(column_list) VALUES(value_list);
es una forma más corta de
INSERT OR REPLACE INTO table(column_list) VALUES(value_list);
Para que REPLACE se ejecute correctamente, la estructura de la tabla debe tener filas únicas, ya sea una clave principal simple o un índice único.
REPLACE elimina, luego INSERTAS el registro y hará que se ejecute un INSERT Trigger si los tienes configurados. Si tiene un disparador en INSERT, puede encontrar problemas.
Esto es una solución ... no verificó la velocidad ...
INSERT OR IGNORE INTO table (column_list) VALUES(value_list);
seguido por
UPDATE table SET field=value,field2=value WHERE uniqueid=''uniquevalue''
Este método permite que ocurra una sustitución sin causar un disparador.