Solución:
Usar 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
Sé que esta es una pregunta antigua, pero Google me trajo aquí recientemente, así que imagino que otros también vendrán aquí.
@chaos es correcto: existe el INSERT ... ON DUPLICATE KEY UPDATE
sintaxis.
Sin embargo, la pregunta original se hacía específicamente sobre MySQL, y en MySQL existe la REPLACE INTO ...
sintaxis. En mi humilde opinión, este comando es más fácil y sencillo de usar para upserts. Del manual:
REPLACE funciona exactamente como INSERT, excepto que si una fila antigua en 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 que se inserte la fila nueva.
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 todos columnas de un registro existente (y no simplemente actualizar algunos columnas.) El comportamiento de MySQL REPLACE INTO
es muy parecido al de Sqlite INSERT OR REPLACE INTO
. Consulte esta pregunta para obtener algunas soluciones si solo desea actualizar algunas columnas (y no todas) si el registro ya existe.