¿Hay una manera fácil de INSERT
una fila cuando no existe, o UPDATE
si existe, usando una consulta MySQL?
¿Hay una manera fácil de INSERT
una fila cuando no existe, o UPDATE
si existe, usando una consulta MySQL?
Respuestas:
Uso 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
geb
y topic
funcionará ( ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).
MERGE
pero no estoy seguro de si su sintaxis es idéntica a la de SQL Server.
NULL
, para permitir que el auto_increment
comportamiento funcione (que de lo contrario, sí, funciona como presume; consulte dev.mysql.com/doc/refman/5.5/en/example-auto-increment. html )
VALUES(col)
para obtener el valor del argumento de inserción en caso de duplicado. Por ejemplo:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Sé que esta es una vieja pregunta, pero Google me llevó aquí recientemente, así que imagino que otros también vendrán.
@chaos es correcto: existe la INSERT ... ON DUPLICATE KEY UPDATE
sintaxis.
Sin embargo, la pregunta original fue sobre MySQL específicamente, y en MySQL existe la 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 que REPLACE INTO
no es como UPDATE
. Como dice el manual, REPLACE
elimina la fila si existe, 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 MySQL REPLACE INTO
es muy similar al de Sqlite INSERT OR REPLACE INTO
. Consulte esta pregunta para conocer algunas soluciones alternativas si solo desea actualizar algunas columnas (y no todas) si el registro ya existe.
MERGE
. En general, el concepto a menudo se conoce como"UPSERT"
.