sql >> Base de Datos >  >> RDS >> Mysql

Actualización de SQL en actualización de clave duplicada

Lo primero es lo primero, esa clave principal de varias columnas es probablemente una mala idea; como ha descubierto, dificulta la manipulación de los campos individuales. Lo que debe hacer es agregar una columna bigint de incremento automático a esa tabla, que se convertirá en su nueva clave principal, y su restricción de unicidad de tres columnas puede ser un índice único en su lugar. Debería funcionar mejor... pero también te permitirá hacer el tipo de manipulación que necesitas. Le permitirá realizar modificaciones, pero aún le permitirá identificar las filas originales por su índice entero.

Si hace eso, su "actualización única" ahora se puede hacer de manera segura, siempre que no le importe crear algunas tablas temporales para trabajar. Algo como esto:

Cree un par de tablas temporales con el mismo esquema, pero sin el único índice de tres columnas:puede tener un índice no único, porque ayudará a las consultas que está a punto de realizar;

Copie los registros que necesita procesar en la primera tabla (incluida la clave principal entera única);

Actualizar todo el detail columnas que necesita actualizar en la tabla temporal;

Usa INSERT ... SELECT con SUM y GROUP BY para fusionar esos registros en la segunda tabla;

INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...

Finalmente, elimine todos los registros en la tabla temp1 de la tabla original (usando la clave primaria entera) e inserte los registros en la tabla temp2 en la tabla original.