query - select replace mysql
¿Cómo INSERTAR un registro o ACTUALIZAR si ya existe? (6)
Como han mencionado otros, debe usar "insertar ... en la actualización de clave duplicada", a veces denominado "upsert". Sin embargo, en su caso específico, no desea utilizar un valor estático en la actualización, sino los valores que pasa a la cláusula de valores de la declaración de inserción.
Específicamente, creo que quieres actualizar dos columnas si la fila ya existe:
1) sent_time
2) status
Para hacer esto, usarías una declaración "upsert" como esta (usando tu ejemplo):
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
ON DUPLICATE KEY UPDATE
sent_time = values(sent_time),
status = values(status);
Tengo una tabla con columnas record_id
(auto inc), sender
, sent_time
y status
.
En caso de que no haya ningún registro de un remitente en particular, por ejemplo, "remitente1", tengo que INSERTAR un nuevo registro, de lo contrario tendré que ACTUALIZAR el registro existente que pertenece a "usuario1".
Así que si no hay ningún registro ya almacenado, ejecutaría
# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
De lo contrario, ejecutaría la instrucción UPDATE.
De todos modos ... ¿alguien sabe cómo combinar estas dos declaraciones para insertar un nuevo registro si no hay ningún registro donde el valor del remitente de campo sea "usuario1" de lo contrario, actualice el registro existente?
Echa un vistazo a "Insertar en la actualización clave duplicada" .
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
MySQL soporta la sintaxis insert-on-duplicate , fe:
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
Si tiene restricciones sólidas sobre la mesa, entonces también puede usar REPLACE INTO
para eso. Aquí hay una cita de MySQL:
REPLACE funciona exactamente igual que INSERT, excepto que si una fila antigua en la tabla tiene el mismo valor que una fila nueva para un CLAVE PRIMARIA o un índice ÚNICO, la fila antigua se elimina antes de insertar la nueva fila.
La sintaxis es básicamente la misma que INSERT INTO
, simplemente reemplace INSERT
by REPLACE
.
INSERT INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
entonces sería
REPLACE INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
Tenga en cuenta que este es un comando específico de MySQL que no ocurre en otros DB, así que tenga en cuenta la portabilidad.
Una de las opciones es usar en la sintaxis de actualización duplicada
Otras opciones están haciendo seleccionar para averiguar si existe un registro y luego hacer la inserción / actualización en consecuencia. Tenga en cuenta que si está realizando una selección de transacciones, no terminará la transacción explícitamente, por lo que es seguro usarla.
use merge statement :
merge into T1
using T2
on (T1.ID = T2.ID)
when matched
then update set
T1.Name = T2.Name
when not matched
then insert values (T2.ID,T2.Name);