update query into ejemplo mysql insert insert-update

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?



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

insert-on-duplicate

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);