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á.

¿Fue útil?

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` ) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top