sql >> Databasteknik >  >> RDS >> Mysql

Om jag har en MySQL-tabell med flera kolumnvärden lika, hur tar jag bort alla utom två av de senaste posterna?

Detta kan vara en lösning på ditt problem.

Men eftersom det inte finns någon datum-tid-kolumn antar jag att id-kolumnen är den primära nyckeln. Och det är Auto_increment . Så mitt antagande är att ju större nummer desto nyare rekord. (det borde vara sant om du inte hade några gamla datadumpar i tabellen)

Se till att du säkerhetskopierar dina data innan du raderar eftersom detta kommer att leda till att du förlorar permanent data. Ännu bättre, du kan göra en kopia av den aktuella tabellen till en annan tabell och arbeta på den nya tabellen för att se till att logiken nedan är korrekt. Ändra sedan frågorna som jag har nedan för att läsa från tbl_new istället på tbl

du kan duplicera din tabell via något som

CREATE TABLE tbl_new LIKE tbl;

Jag har lämnat kommentarer för varje fråga

DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
-- get the #1 top records
CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;

-- get the #2 top records
CREATE TEMPORARY TABLE keepers2 AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl AS k
WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;


-- create a temp table where you have all he ids that you want to keep
CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
SELECT id FROM keepers1
UNION ALL
SELECT id FROM keepers2;


-- delete all records that you don't want to keep
DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);

om detta är ett engångsrensningsjobb bör du kunna utföra frågorna från konsolen. men om du letar efter en rekryterande jobb dem bör du förmodligen ta den här koden och lägga in den i en procedur.

Notera:här använder jag MEMORY TEMPORARY-tabeller för bättre prestanda. Du kan stöta på ett problem som säger "Tablet är fullt" detta beror på att du har för många poster. sedan kan du öka värdet max_heap_table_size för sessionen något som

SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G

Detta ger dig ditt nuvarande värde

SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';


  1. Hur skriver man parametriserad orakelinfogningsfråga?

  2. Välj endast de senaste grupperade posterna

  3. PDOException:SQLSTATE[HY000] [2002] php_network_getaddresses:getaddriinfo misslyckades:Namn eller tjänst okänd

  4. SQL Server Clustering från ett Oracle RAC-perspektiv