En Actualización de clave duplicada igual que insertar

He buscado pero no he encontrado si es posible.

Tengo esta consulta MySQL:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 

El ID de campo tiene un “índice único”, por lo que no puede haber dos. Ahora si la misma identificación ya está presente en la base de datos, me gustaría actualizarla. Pero realmente tengo que especificar todos estos campos de nuevo, como:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8 

O:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g) 

He especificado todo lo que ya está en la inserción …

Una nota extra, me gustaría utilizar el trabajo para obtener la identificación.

 id=LAST_INSERT_ID(id) 

Espero que alguien me diga cuál es la forma más eficiente.

La instrucción UPDATE se da para que los campos más antiguos puedan actualizarse a un nuevo valor. Si sus valores anteriores son los mismos que los nuevos, ¿por qué debería actualizarlos en cualquier caso?

Por ej. si sus columnas aa g ya están configuradas como 2 a 8 ; no habría necesidad de volver a actualizarlo.

Alternativamente, puede usar:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g; 

Para obtener el id de LAST_INSERT_ID ; necesita especificar la aplicación de back-end que está utilizando para el mismo.

Para LuaSQL, un conn:getlastautoid() el valor.

Existe una extensión específica de MySQL para SQL que puede ser lo que usted desea: REPLACE INTO

Sin embargo, no funciona del mismo modo que ‘EN ACTUALIZACIÓN DUPLICADA’

  1. Elimina la fila anterior que choca con la nueva fila y luego inserta la nueva fila. Siempre que no tenga una clave principal en la tabla, estaría bien, pero si lo hace, entonces, si cualquier otra tabla hace referencia a esa clave principal

  2. No puede hacer referencia a los valores en las filas antiguas, por lo que no puede hacer un equivalente de

     INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) ON DUPLICATE KEY UPDATE id=1, a=2, b=3, c=c + 1; 

Me gustaría utilizar el trabajo para obtener la identificación.

Eso debería funcionar: last_insert_id () debería tener el valor correcto siempre que su clave principal se autoincrementa.

Sin embargo, como dije, si realmente usa esa clave primaria en otras tablas, REPLACE INTO probablemente no sea aceptable para usted, ya que borra la fila anterior que chocó con la clave única.

Alguien más sugirió antes de que pueda reducir algunos tipeos haciendo:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`); 

No hay otra manera, tengo que especificar todo dos veces. Primero para el inserto, segundo en el caso de actualización.

Aquí hay una solución a su problema:

Intenté resolver un problema como el tuyo y quiero sugerir probarlo desde un aspecto simple.

Siga estos pasos: aprenda de una solución simple.

Paso 1: cree un esquema de tabla usando esta consulta SQL:

 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(32) NOT NULL, `status` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `no_duplicate` (`username`,`password`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 

Una tabla <code/> usuario </ code> con datos”> </p>
<p>  Paso 2: <strong>cree un índice de dos columnas</strong> para evitar la duplicación de datos usando la siguiente consulta SQL: </p>
<pre> <code>ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);</code> </pre>
<p>  o bien, <strong>cree un índice de dos columnas desde la GUI de la</strong> siguiente manera: <img src= Seleccionar columnas para crear un índice Índices del usuario de la tabla <code/> </ code>“> </p>
<p>  Paso 3: <strong>Actualice si existe, inserte si no</strong> utiliza las siguientes consultas: </p>
<pre> <code>INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal'; INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal';</code> </pre>
<p> <img src=

En caso de que pueda utilizar un lenguaje de scripts para preparar sus consultas SQL, podría reutilizar los pares campo = valor utilizando SET lugar de (a,b,c) VALUES(a,b,c) .

Un ejemplo con PHP:

 $pairs = "a=$a,b=$b,c=$c"; $query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs"; 

Tabla de ejemplo:

 CREATE TABLE IF NOT EXISTS `tester` ( `a` int(11) NOT NULL, `b` varchar(50) NOT NULL, `c` text NOT NULL, UNIQUE KEY `a` (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Es posible que desee considerar el uso de la syntax REPLACE INTO , pero tenga cuidado, al duplicar la tecla PRIMARY / UNIQUE, ELIMINA la fila e INSERTA una nueva.

No necesitará volver a especificar todos los campos. Sin embargo, debe considerar la posible reducción del rendimiento (depende del diseño de su mesa).

Advertencias:

  • Si tiene la clave primaria AUTO_INCREMENT, recibirá una nueva
  • Los índices probablemente necesitarán ser actualizados

puede usar Insertar ignorar para ese caso, ignorará si obtiene registros duplicados INSERTAR IGNORAR …; – sin EN LLAVE DUPLICADA