sql >> Databasteknik >  >> RDS >> Mysql

SQL-uppdatering vid dubblettnyckeluppdatering

Till att börja med är den primärnyckeln med flera kolumner förmodligen en dålig idé; som du har upptäckt gör det det svårt att manipulera de enskilda fälten. Vad du borde göra är att lägga till en autoinkrement bigint-kolumn till den tabellen, som kommer att bli din nya primärnyckel, och din trekolumns unikhetsbegränsning kan istället vara ett unikt index. Det borde fungera bättre... men det kommer också att tillåta dig att göra den typ av manipulation du behöver också. Det låter dig utföra ändringar men låter dig fortfarande identifiera de ursprungliga raderna genom deras heltalsindex.

Om du gör det kan din "engångsuppdatering" nu göras säkert, så länge du inte har något emot att skapa några tillfälliga tabeller att arbeta med. Något så här:

Skapa ett par tillfälliga tabeller med samma schema, men utan den unika index med tre kolumner - du kan ha ett icke-unikt index, eftersom det kommer att hjälpa de frågor du ska utföra;

Kopiera de poster du behöver bearbeta till den första tabellen (inklusive den unika heltalsprimärnyckeln);

Uppdatera alla detail kolumner du behöver uppdatera i den tillfälliga tabellen;

Använd INSERT ... SELECT med SUM och GROUP BY för att slå samman dessa poster till den andra tabellen;

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

Ta slutligen bort alla poster i temp1-tabellen från den ursprungliga tabellen (med heltalsprimärnyckeln) och infoga posterna i temp2-tabellen i den ursprungliga tabellen.



  1. Hur OBJECTPROPERTYEX() fungerar i SQL Server

  2. För inloggning GET eller POST?

  3. Hur väljer man grupperade rader med endast NULL-värden?

  4. Hur WEIGHT_STRING() fungerar i MariaDB