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

Se ho una tabella MySQL con più valori di colonna uguali, come faccio a eliminare tutte le voci più recenti tranne due?

Questa potrebbe essere una soluzione al tuo problema.

Tuttavia, poiché non esiste una colonna data-ora, presumo che la colonna id sia la chiave primaria. Ed è Auto_increment . Quindi la mia ipotesi è che maggiore è il numero, più nuovo è il record. (dovrebbe essere vero a meno che tu non abbia alcuni vecchi dump di dati nella tabella)

Assicurati di eseguire il backup dei tuoi dati prima di eliminarli poiché ciò causerà la perdita permanente dei dati. Ancora meglio, puoi creare una copia della tabella corrente in una tabella diversa e lavorare sulla nuova tabella per assicurarti che la logica seguente sia corretta. Quindi cambia le query che ho di seguito per leggere da tbl_new invece su tbl

puoi duplicare la tua tabella tramite qualcosa come

CREATE TABLE tbl_new LIKE tbl;

Ho lasciato commenti per ogni domanda

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

se si tratta di un lavoro di pulizia una tantum, dovresti essere in grado di eseguire le query dalla console. ma se stai cercando un lavoro da reclutare dovresti probabilmente prendere questo codice e metterlo in una procedura.

Nota:qui sto usando le tabelle MEMORY TEMPORARY per prestazioni migliori. Potresti riscontrare un problema che dice "La tabella è piena" questo è perché hai troppi record. quindi puoi aumentare il valore max_heap_table_size per la sessione qualcosa come

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

Questo ti darà il tuo valore attuale

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