2009-03-30 12 views
23

Un poco extraño ponerlo en palabras tan cortas, je.Crear si una entrada no existe, de lo contrario ¿actualizar?

De todos modos, lo que quiero es básicamente actualizar una entrada en una tabla si existe, de lo contrario, crear una nueva llenándola con los mismos datos.

Sé que es fácil, pero yo soy relativamente nuevo en MySQL en términos de lo mucho que he utilizado: P

Respuesta

22

Uso 'CAMBIAR EN':

REPLACE INTO table SET id = 42, foo = 'bar'; 

Vea más en el MySQL documentation

+0

Creó más que en la entrada para REEMPLAZAR EN el usuario SET ip = '$ uip', lastcheck = '$ tim' – unrelativity

+0

¿IP o última comprobación es una clave principal o un índice único? – carl

+0

Entonces se espera el comportamiento que está experimentando. Un campo debe ser primario o exclusivo para que esto funcione. De lo contrario, ¿cómo sabría MySQL para evitar duplicados? Parece que debe tener el user_id en esta tabla (como clave principal) que también configura en su reemplazo. – carl

2

Mirar hacia arriba REPLACE en el manual de MySQL.

REEMPLAZAR funciona exactamente igual que INSERT, excepto que si un viejo fila de la tabla tiene el mismo valor que una nueva fila para una PRIMARY KEY o un índice UNIQUE, la vieja fila es eliminada antes de la nueva fila es insertada. Consulte la Sección 12.2.5, "INSERTAR Sintaxis".

REEMPLAZAR es una extensión de MySQL para el estándar SQL . Se inserta o elimina e inserta. Para otra extensión de MySQL a SQL estándar - que inserta o actualiza - vea Section 12.2.5.3, "INSERTAR ... EN Sintaxis de ACTUALIZACIÓN DE LLAVE DUPLICADA".

Si usted tiene la siguiente consulta INSERT:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24) 

Esta es la consulta REEMPLAZAR debe ejecutar:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24) 
58

Muchos desarrolladores todavía ejecutan una consulta para verificar si un campo está presente en una tabla y luego ejecutar una consulta de inserción o actualización de acuerdo con el resultado de la primera consulta. Intenta usar la sintaxis ON DUPLICATE KEY, esto es mucho más rápido y mejor que ejecutar 2 consultas.Más información se puede encontrar here

insertar en la tabla (A, B, C) VALORES (4,5,6) EN DUPLICATE KEY ACTUALIZACIÓN c = 9;

si desea mantener el mismo valor para C que puede hacer una actualización con el mismo valor

Insertar en la tabla (A, B, C) VALORES (4,5,6) ON DUPLICATE KEY UPDATE c = 6;

la diferencia entre 'reemplazar' y 'en clave duplicada':

reemplazar: inserciones o eliminaciones e inserta

de clave duplicada: inserciones o actualizaciones

si su tabla no tiene una clave principal o clave única, el reemplazo no tiene ningún sentido.

También puede usar la función VALUES para evitar tener que especificar los valores reales dos veces. P.ej. en lugar de

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

puede utilizar

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

Dónde VALUES(c) evaluará al valor especificado prevously (6).

+4

IMO, esta respuesta responde mejor a la pregunta. Si realmente desea una ACTUALIZACIÓN cuando la fila ya existe, REPLACE es destructiva: "REPLACE funciona exactamente como INSERT, excepto que si una fila anterior en la tabla tiene el mismo valor que una nueva fila para una PRIMARY KEY o un índice UNIQUE, el la fila anterior se elimina antes de que se inserte la nueva fila ". (Manual de MySQL) – richardkmiller

+3

+1: respuesta mucho mejor que la respuesta aceptada – mathieu

+0

Tenga en cuenta que no es exactamente "Insertar o actualizar", sino "Insertar o Eliminar + Insertar", lo que significa que esta no es una solución adecuada si solo desea actualizar una parte de las columnas: a diferencia de una actualización, el valor de las columnas sin valores especificados se establecerá en Valor predeterminado (y se perderá) –

8

Como han dicho los demás, REPLACE es el camino a seguir. Sin embargo, tenga cuidado de usarlo, ya que realmente hace un DELETE y INSERT en la mesa. Esto está bien la mayor parte del tiempo, pero si tiene claves externas con restricciones como ON DELETE CASCADE, puede causar algunos problemas importantes.

Cuestiones relacionadas