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 UPDATE
CONSULTA:
fuente
affected row count
produce la2
actualizació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 UPDATE
aumentan 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
REPLACE
no está documentado en el documento vinculado.Cuando se usa SQLite:
Siempre que esa
id
sea la clave principal. O bien, simplemente inserta otra fila. Ver INSERTAR (SQLite).fuente
replace into
hace 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
INSERT
oSELECT
, aunque estoy de acuerdo en que probablemente sea una mejor práctica.fuente
En caso de que desee crear un
non-primary
campo como criterio / condiciónON DUPLICATE
, puede hacer unaUNIQUE INDEX
clave 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
name
y enage
todas las demás filas.Después de eso, debería desencadenar el
ON DUPLICATE
evento.fuente
En mi caso, creé las consultas a continuación, pero en la primera consulta si
id
1 ya existe y la edad ya está allí, después de eso, si crea la primera consulta sin,age
el valor deage
no 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