Pregunta

¿Hay una manera fácil de INSERTAR una fila cuando no existe, o de UPDATE si existe, usando una consulta MySQL?

¿Fue útil?

Solución

Sí, INSERT ... ON ACTUALIZACIÓN DE CLAVE DUPLICADA . Por ejemplo:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

Otros consejos

Sé que esta es una pregunta antigua, pero Google me llevó aquí recientemente, así que imagino que otros también vendrán aquí.

@chaos es correcto: existe el < code> INSERTAR ... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA sintaxis.

Sin embargo, la pregunta original se hizo sobre MySQL específicamente, y en MySQL existe el REPLACE INTO ... sintaxis. En mi humilde opinión, este comando es más fácil y más sencillo de usar para upserts. Del manual:

  

REPLACE funciona exactamente como INSERT, excepto que si una fila anterior de la tabla tiene el mismo valor que una fila nueva para una CLAVE PRIMARIA o un índice ÚNICO, la fila anterior se elimina antes de insertar la nueva fila.

Tenga en cuenta que esto no es SQL estándar. Un ejemplo del manual:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

Editar: solo una advertencia justa de que REPLACE INTO no es como UPDATE . Como dice el manual, REPLACE elimina la fila si existe, luego inserta una nueva. (Tenga en cuenta las divertidas " 2 filas afectadas " en el ejemplo anterior). Es decir, reemplazará los valores de todas columnas de un registro existente (y no simplemente actualizará algunos columnas.) El comportamiento de REPLACE INTO de MySQL es muy similar al de INSERT O REPLACE IN de Sqlite . Consulte esta pregunta para algunas soluciones si solo desea actualizar algunas columnas ( y no todas las columnas) si el registro ya existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top