update not ejemplo duplicate sql mysql insert-update upsert

not - ¿Cómo actualizo si existe, inserte si no(AKA "upsert" o "merge") en MySQL?



mysql insert ignore (2)

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

@chaos es correcto: existe la sintaxis INSERT ... ON DUPLICATE KEY UPDATE .

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

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, la fila anterior se elimina antes de que se inserte 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, y luego inserta una nueva. (Observe las divertidas "2 filas afectadas" en el ejemplo anterior). Es decir, reemplazará los valores de todas las columnas de un registro existente (y no simplemente actualizará algunas columnas). El comportamiento de REPLACE INTO MySQL es muy similar al de Sqlite INSERT OR REPLACE INTO . Consulte esta pregunta para conocer algunas soluciones provisionales si solo desea actualizar algunas columnas (y no todas las columnas) si el registro ya existe.

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


Sí, INSERT ... ON DUPLICATE KEY UPDATE . 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