Inserte en una tabla o actualización mysql si existe
-
25-09-2019 - |
Pregunta
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 uso insert IGNORE
Ignorará el error, pero aún no se actualizará.
Solución
Usar INSERT ... ON DUPLICATE KEY UPDATE
CONSULTA:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name="A", age=19
Otros consejos
Echa un vistazo a reemplazar
http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE into table (id, name, age) values(1, "A", 19)
Cuando se usa la inserción por lotes, use la siguiente sintaxis:
INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
name = VALUES (name),
...
Probar esto:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Espero que esto ayude.
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 después de la primera inserción con id='1'
cada vez intenta insertar id='1'
Actualizará el nombre y la edad y el nombre anterior de la edad cambiarán.
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);
INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;
REPLACE INTO table (id, name, age) VALUES(1, "A", 19);
Toda esta solución funcionará con respecto a su pregunta.
Si desea saber en detalles sobre esta declaración Visite este enlace
Cuando se usa SQLite:
REPLACE into table (id, name, age) values(1, "A", 19)
Siempre que id
es la clave principal. O de lo contrario simplemente inserta otra fila. Ver INSERTAR (Sqlite).
Solo porque estaba aquí buscando esta solución, pero para actualizar desde otra tabla idénticamente estructurada (en mi caso, el sitio web prueba DB para vivir db):
INSERT live-db.table1
SELECT *
FROM test-db.table1 t
ON DUPLICATE KEY UPDATE
ColToUpdate1 = t.ColToUpdate1,
ColToUpdate2 = t.ColToUpdate2,
...
Como se mencionó en otro lugar, solo las columnas que desea actualizar deben incluirse después ON DUPLICATE KEY UPDATE
.
No es necesario enumerar las columnas en el INSERT
o SELECT
, aunque estoy de acuerdo en que probablemente sea una mejor práctica.
En mi caso, creé las consultas a continuación pero en la primera consulta si id
1 ya es existe y la edad ya está allí, después de eso si crea la primera consulta sin age
que el valor de age
no será ninguno
REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19
Para evitar el problema anterior, cree una consulta como a continuación
INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19
Que te ayude ...
En caso de que desee mantener el campo antiguo (por ejemplo, nombre). La consulta será:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name=name, age=19;
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Tampoco olvide preocuparse por la restricción clave única.
ALTER TABLE `table` ADD UNIQUE `unique_key` ( `id` )