sql >> Database teknologi >  >> RDS >> Mysql

Hvis jeg har en MySQL-tabel med flere samme kolonneværdier, hvordan sletter jeg så alle de seneste poster undtagen to?

Dette kan være en løsning på dit problem.

Men da der ikke er nogen dato-tid-kolonne, antager jeg, at id-kolonnen er den primære nøgle. Og det er Auto_increment . Så min antagelse er, at jo større tal, jo nyere er rekorden. (det burde være sandt, medmindre du havde nogle gamle datadumps i tabellen)

Sørg for at sikkerhedskopiere dine data, før du sletter, da dette vil medføre, at du går tabt permanent. Endnu bedre, du kan lave en kopi af den aktuelle tabel til en anden tabel og arbejde på den nye tabel for at sikre dig, at logikken nedenfor er korrekt. Skift derefter de forespørgsler, som jeg har nedenfor for at læse fra tbl_new i stedet på tbl

du kan duplikere din tabel via sådan noget som

CREATE TABLE tbl_new LIKE tbl;

Jeg har efterladt kommentarer til hver forespørgsel

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);

hvis dette er et engangsoprydningsjob, bør du være i stand til at udføre forespørgslerne fra konsollen. men hvis du leder efter et rekrutteringsjob, skal du nok tage denne kode og indsætte den i en procedure.

Bemærk:her bruger jeg MEMORY TEMPORARY-tabeller for bedre ydeevne. Du kan støde på et problem, der siger "Tabellen er fuld" det er fordi du har for mange poster. så kan du øge værdien max_heap_table_size for sessionen sådan noget 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

Dette vil give dig din nuværende værdi

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


  1. Ydeevne af MySQL Insert-sætninger i Java:Batch-tilstand forberedte sætninger vs enkelt insert med flere værdier

  2. MySQL-indekskardinalitet - ydeevne vs lagereffektivitet

  3. Hvordan laver jeg en fuzzy match af firmanavne i MYSQL med PHP til autofuldførelse?

  4. Timeout for OracleDataReader.Read-metoden