2012-02-13 14 views
5

Muy bien, tengo una pregunta, no es realmente un problema."REEMPLAZAR" versus INSERTAR [SI]

Tengo una tabla en mi base de datos, bastante pequeña, solo 3 columnas pero con posibilidades de crecer. Tengo dos soluciones para mi problema, pero no estoy seguro de por qué usar una u otra.

Tengo un dato que puede o no estar en la base de datos. Dos formas de resolver esto. Tengo la identificación única, así que es fácil de verificar.

  1. Comprobar si los registros existe en la base de datos, y si no, la base de datos INSERT INTO
  2. Uso REPLACE INTO, porque tengo la ID ya.

Mi pregunta ahora es. Cuál es mejor usar ¿Cuáles son los pros y los contras en el uso de cualquiera de los 2 resultados? ¿O hay un mejor resultado?

Una nota, los datos son exactamente los mismos, por lo que no hay posibilidad de que el registro se actualice con un valor más reciente. Por lo tanto, el REPLACE INTO insertará datos que ya están allí.

+10

Tenga cuidado, 'REPLACE INTO' se implementa internamente como' DELETE' y luego como 'INSERT'. La eliminación es una eliminación normal, lo que significa que comprobará las claves externas y obedecerá las cláusulas 'ON DELETE'. Usted * probablemente * quiere 'INSERT INTO ... ON DUPLICATE KEY UPDATE ...' en su lugar de todos modos. – Charles

+0

Pero, ¿cuál es la mejor práctica aquí? Y por qué –

+2

Además, si intenta actualizar una fila con los mismos valores (existentes), MySQL detectará que los valores son los mismos y omitirá la actualización, ahorrando tiempo, bloqueos, etc. Otra razón para usar 'INSERTAR INTO ... ON DUPLICATE KEY UPDATE ... 'frente a eliminar la fila existente primero. –

Respuesta

10

REPLACE INTO no se recomienda aquí; no es necesario que reemplace nada. Lo hace DELETE seguido de INSERT, con todas las consecuencias. Por ejemplo, todos los índices deben actualizarse, lo que conduce a un trabajo innecesario y fragmentación de índices si lo usa con frecuencia.

Por otro lado, es ON DUPLICATE KEY UPDATE, que se utiliza principalmente para los contadores, pero no se están actualizando su fila con incrementos o cualquier otro cambio de valor, por lo que habría que utilizar la sintaxis extraño como SET id=id o algo similar.

Verificando el registro existe en la base de datos sería la mejor solución para usted, pero en lugar de utilizar otra consulta dejar que MySQL hacer que el registro para usted y su uso:

`INSERT IGNORE INTO ...` 

De esta manera si se intenta insertar cualquier fila con clave única o primaria duplicada simplemente no se insertará sin generar ningún error. Tenga en cuenta el efecto secundario de la posibilidad de que falten otros mensajes de error, pero si sabe exactamente qué inserta, debería estar bien.

Cuestiones relacionadas