Quiero agregar una fila a una tabla de base de datos, pero si existe una fila con la misma clave única, quiero actualizar la fila.
Por ejemplo:
insert into table (id, name, age) values(1, "A", 19)
Digamos que la clave única es id, y en mi Base de datos , hay una fila con id = 1. En ese caso, quiero actualizar esa fila con estos valores. Normalmente esto da un error.
Si lo uso insert IGNORE, ignoraré el error, pero aún así no se actualizará.
mysql
sql
insert-update
upsert
Keshan
fuente
fuente

Respuestas:
Utilizar
INSERT ... ON DUPLICATE KEY UPDATECONSULTA:
fuente
affected row countproduce la2actualización exitosa (en clave duplicada) de una sola fila. ¿Alguien más tuvo este resultado? (Los datos se actualizan correctamente: lo que significa que solo se actualiza 1 fila)ON DUPLICATE KEY UPDATEaumentan las filas afectadas en 2. Informa 0 si nada se actualiza realmente (igual que el normalUPDATE).Echa un vistazo a REPLACE
http://dev.mysql.com/doc/refman/5.0/en/replace.html
fuente
Cuando use la inserción por lotes, use la siguiente sintaxis:
fuente
VALUES(name)no funciona, puedes intentarloname = 'name_value',...;Probar esto:
Espero que esto ayude.
fuente
Prueba esto:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'Nota:
Aquí, si id es la clave principal, luego de la primera inserción,
id='1'cada vez que intente insertarid='1'actualizará el nombre y la edad, y la edad del nombre anterior cambiará.fuente
Todas estas soluciones funcionarán con respecto a su pregunta.
Si desea conocer los detalles de estas declaraciones, visite este enlace.
fuente
REPLACEno está documentado en el documento vinculado.Cuando se usa SQLite:
Siempre que esa
idsea la clave principal. O bien, simplemente inserta otra fila. Ver INSERTAR (SQLite).fuente
replace intohace es exactamente "insertar o actualizar cuando exista". @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();Solo porque estaba buscando esta solución, pero para actualizar desde otra tabla idénticamente estructurada (en mi caso, prueba de sitio web DB para vivir DB):
Como se mencionó en otra parte, solo las columnas que desea actualizar deben incluirse después
ON DUPLICATE KEY UPDATE.No es necesario enumerar las columnas en
INSERToSELECT, aunque estoy de acuerdo en que probablemente sea una mejor práctica.fuente
En caso de que desee crear un
non-primarycampo como criterio / condiciónON DUPLICATE, puede hacer unaUNIQUE INDEXclave en esa tabla para activar elDUPLICATE.Y en caso de que desee combinar dos campos para que sea único en la tabla, puede lograr esto agregando más en el último parámetro.
Tenga en cuenta que solo asegúrese de eliminar primero todos los datos que tengan el mismo valor
namey enagetodas las demás filas.Después de eso, debería desencadenar el
ON DUPLICATEevento.fuente
En mi caso, creé las consultas a continuación, pero en la primera consulta si
id1 ya existe y la edad ya está allí, después de eso, si crea la primera consulta sin,ageel valor deageno será ningunopara evitar el problema anterior, cree una consulta como la siguiente
que te ayude ...
fuente
En el caso, desea mantener el campo antiguo (por ejemplo: nombre). La consulta será:
fuente