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)
La identificación 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 nuevamente, 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)
Ya especifiqué todo en el inserto ...
¡Una nota adicional, me gustaría usar el trabajo para obtener la identificación!
id=LAST_INSERT_ID(id)
Espero que alguien pueda decirme cuál es la forma más eficiente.
a=VALUES(a), b=VALUES(b), ...
es el camino que debe seguir. Así es como lo hago para todas misINSERT ON DUPLICATE KEY UPDATE
declaraciones.Respuestas:
La
UPDATE
declaración se proporciona para que los campos más antiguos se puedan actualizar a un nuevo valor. Si sus valores anteriores son los mismos que los nuevos, ¿por qué necesitaría actualizarlo en cualquier caso?Por ej. si sus columnas
a
ag
ya están establecidos como2
a8
; no habría necesidad de volver a actualizarlo.Alternativamente, puede usar:
Para obtener el
id
deLAST_INSERT_ID
; debe especificar la aplicación de back-end que está utilizando para la misma.Para LuaSQL, a
conn:getlastautoid()
obtiene el valor.fuente
tbl
ya tiene una fila (1,10), entonces:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
establecerá a = 2 . MientrasINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
establecerá a = 10a=a
actualizaciones no es nada. (Las consultas en la pregunta original en realidad tampoco actualizan nada, pero una actualización parece ser lo que pretendía el OP.)Hay una extensión específica de MySQL para SQL que puede ser lo que desea:
REPLACE INTO
Sin embargo, no funciona exactamente igual que 'ACTUALIZACIÓN DUPLICADA'
Elimina la fila anterior que choca con la nueva fila y luego inserta la nueva fila. Siempre y cuando no tenga una clave principal en la tabla, eso estaría bien, pero si lo tiene, si alguna otra tabla hace referencia a esa clave primaria
No puede hacer referencia a los valores en las filas anteriores, por lo que no puede hacer un equivalente de
Eso debería funcionar: last_insert_id () debería tener el valor correcto siempre que su clave principal se incremente automáticamente.
Sin embargo, como dije, si realmente usa esa clave primaria en otras tablas,
REPLACE INTO
probablemente no sea aceptable para usted, ya que elimina la fila anterior que chocó a través de la clave única.Alguien más sugirió antes de que pueda reducir algo de escritura haciendo:
fuente
replace into
consulta?No hay otra manera, tengo que especificar todo dos veces. Primero para la inserción, segundo en el caso de actualización.
fuente
Aquí hay una solución a su problema:
He tratado de resolver problemas como el tuyo y quiero sugerir que pruebes desde un aspecto simple.
Siga estos pasos: Aprenda de una solución simple.
Paso 1: cree un esquema de tabla con esta consulta SQL:
Paso 2: cree un índice de dos columnas para evitar la duplicación de datos utilizando la siguiente consulta SQL:
o Cree un índice de dos columnas desde la GUI de la siguiente manera:
Paso 3: Actualice si existe, inserte si no utiliza las siguientes consultas:
fuente
En caso de que pueda utilizar un lenguaje de secuencias de comandos para preparar sus consultas SQL, puede reutilizar pares de campo = valor utilizando
SET
lugar de(a,b,c) VALUES(a,b,c)
.Un ejemplo con PHP:
Tabla de ejemplo:
fuente
Es posible que desee considerar el uso de la
REPLACE INTO
sintaxis, pero tenga en cuenta que, al duplicar la tecla PRIMARIO / ÚNICO, BORRARÁ 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 tabla).
Advertencias:
fuente
Sé que es tarde, pero espero que alguien reciba ayuda de esta respuesta
Puedes leer el tutorial a continuación aquí:
fuente
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
puede usar insert ignore para tal caso, ignorará si obtiene registros duplicados INSERT IGNORE ...; - sin EN LLAVE DUPLICADA
fuente