2010-06-09 19 views
14

Estoy escribiendo una aplicación y estoy usando MySQL como DBMS, estamos descargando ofertas de propiedad y hubo algunos problemas de rendimiento. La arquitectura anterior se veía así: Se ha actualizado una propiedad. Si el número de filas afectadas no es 1, entonces la actualización no se considera exitosa, de lo contrario, la consulta de actualización resuelve nuestro problema. Si la actualización no fue exitosa y el número de filas afectadas es más de 1, tenemos duplicados y los eliminamos todos. Después de eliminar duplicados si es necesario si la actualización no fue exitosa, ocurre una inserción. Esta arquitectura funcionaba bien, pero hubo algunos problemas de velocidad, ya que las propiedades se eliminan si no se actualizan durante 15 días. Teóricamente, el problema principal es eliminar propiedades, porque algunas propiedades están activas durante meses y los índices están muy lejos el uno del otro (estamos hablando de más de 500 propiedades).¿Reemplazar tiene una cláusula where?

Nuestro anfitrión me dijo que usara sustituyen en lugar de eliminar las propiedades y todas las propiedades en desuso deben ser considerados como muertos. He hecho esto, pero los problemas comenzaron a ocurrir debido a un error de sintaxis y no pude encontrar en ninguna parte un ejemplo de reemplazo con una cláusula where (me gustaría reemplazar una propiedad DEAD con la nueva propiedad en lugar de eliminar la anterior) propiedad e inserte una nueva para asegurar la optimización). Mi consulta era la siguiente:

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue 

Por supuesto, he calculado idValue y manejado todo, pero tuve un error de sintaxis. Me gustaría saber si estoy equivocado y hay una cláusula Where para reemplazar.

He encontrado una solución alternativa, que es incluso mejor que reemplazarla (usando simplemente una consulta de actualización) porque las eliminaciones están sucediendo detrás de las cortinas si uso replace in, pero me gustaría saber si estoy equivocado cuando digo que replace into no tiene una cláusula where. Para mayor referencia, consulte este enlace:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Gracias por sus respuestas de antemano, Lajos Árpád

Respuesta

0

En el enlace de documentación, se muestran tres formas alternativas del comando replace. Aunque elided, el único que puede aceptar una cláusula WHERE es la tercera forma con el select final.

replace parece exagerado en relación con update si entiendo su tarea correctamente.

+0

Muchas gracias por su respuesta. De hecho, es una exageración, tienes toda la razón, solo quiero saber si insertar tiene una cláusula dónde para filtrar qué reemplazar, porque nuestro anfitrión dijo que sí y para aclarar el asunto (si ya encontré) esto no veo una razón para no decirle) REEMPLAZAR [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name, ...)] SELECCIONAR ... Si entendí correctamente, la sintaxis anterior es, donde dices que podría aparecer un. Tiene razón al respecto, sin embargo, la cláusula where está en el select –

+0

Y el reemplazo en no tiene un en el ejemplo, entonces, creo que replace into no tiene un where. –

22

puedo ver que usted ha solucionado su problema, pero para responder a su pregunta original:

REPLACE INTO hace no tienen una cláusula WHERE.

La sintaxis REPLACE INTO funciona exactamente igual queINSERT INTO excepto que ninguna fila de edad con la misma clave principal o único se borran automaticamente antes de insertar la nueva fila.

Esto significa que en lugar de una cláusula WHERE, debe agregar la clave principal para los valores beeing reemplazado a limitar su actualización.

REPLACE INTO myTable (
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 

... proporcionarán el mismo resultado que ...

UPDATE myTable 
SET myColumn1 = 'value1', myColumn2 = 'value2' 
WHERE myPrimaryKey = 100; 

... o más exactamente:

DELETE FROM myTable WHERE myPrimaryKey = 100; 
INSERT INTO myTable(
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 
+1

Sí, he hecho esto. He ejecutado una consulta para encontrar una fila "buena" y actualicé esa fila, así tuve una solución, pero después de resolver esto, tenía mucha curiosidad si lo que me habían contado era cierto y, en base a las respuestas de aquí y mi investigación (probar cosas), reemplazar en falta una cláusula where, por lo tanto, reemplazar es una inserción delete +, por lo que mis índices aún no se optimizarán. Solo necesitaba una actualización allí. De todos modos, gracias por tu respuesta. –

+0

gracias Ivar. Más útil – khaverim