2010-02-12 22 views
46

Nunca he visto la sintaxis INSERT OR REPLACE INTO names (id, name) VALUES (1, "John") utilizada en SQL anteriormente, y me preguntaba por qué es mejor que 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?SQLite "INSERT O REPLACE INTO" frente a "UPDATE ... WHERE"

Respuesta

76

ACTUALIZACIÓN no hará nada si la fila no existe.

Donde como INSERTAR O REEMPLAZAR insertaría si la fila no existe, o reemplaza los valores si lo hace.

+0

Gracias por la respuesta. ¿Es esto algo específico de SQLite? –

+0

No estoy al tanto de este servidor inSql, aunque el servidor Sql ahora tiene un comando MERGE. Y rom de MS Access, tampoco he visto algo como esto. –

+0

mysql tiene "reemplazar en". – fastmultiplication

4

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.

+2

No creo que esto sea correcto. La documentación de sqlite (a partir del 1 de julio de 2010, versión 3.6.23.1) dice que 'REPLACE es un alias para INSERT OR REPLACE' y, por lo tanto, tendría el mismo comportamiento. En mi experiencia, este es el caso ... – fostandy

+0

Creo que hará un delete-> insert si encuentra un conflicto – StErMi

+1

@fostandy REPLACE es de hecho un alias para INSERTAR O REEMPLAZAR, pero la respuesta de la que estás hablando está hablando ACTUALIZAR (porque de eso se trataba la pregunta). – hatfinch

29

Actualmente estoy trabajando en una declaración de este tipo y descubrí otro hecho al observar: INSERTAR O REEMPLAZAR reemplazará cualquier valor no proporcionado 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.

+7

+1; para decirlo de otra manera: siempre especifique el _completo conjunto de valores_ debe tener la fila "actualizada" - no se conservan los valores existentes; el motivo de este comportamiento es que, de hecho, no es una operación * update * para una fila existente, sino una eliminación, seguida de una reinserción. – mklement0

5
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 REEMPLAZAR para ejecutar correctamente la estructura de tabla debe tener filas únicas, ya sea una clave primaria simple o un índice único.

REEMPLAZAR borra, luego INSERTAS el registro y provocará que se ejecute un disparador INSERTAR si las tiene configuradas. Si tiene un disparador en INSERT, puede encontrar problemas.


Este es un trabajo en torno .. no se comprueba 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 un reemplazo que se produzca sin causar un disparador.

Cuestiones relacionadas