Mysql
 sql >> Base de données >  >> RDS >> Mysql

Si j'ai une table MySQL avec plusieurs valeurs de colonne identiques, comment supprimer toutes les entrées les plus récentes sauf deux ?

Cela peut être une solution à votre problème.

Cependant, comme il n'y a pas de colonne date-heure, je suppose que la colonne id est la clé primaire. Et c'est Auto_increment . Donc, mon hypothèse est que plus le nombre est grand, plus l'enregistrement est récent. (cela devrait être vrai à moins que vous n'ayez d'anciens vidages de données dans la table)

Assurez-vous de sauvegarder vos données avant de les supprimer, car cela entraînera une perte permanente de données. Mieux encore, vous pouvez faire une copie de la table actuelle dans une table différente et travailler sur la nouvelle table pour vous assurer que la logique ci-dessous est correcte. Ensuite, modifiez les requêtes que j'ai ci-dessous pour lire à partir de tbl_new à la place sur tbl

vous pouvez dupliquer votre table via quelque chose comme

CREATE TABLE tbl_new LIKE tbl;

J'ai laissé des commentaires pour chaque requête

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

s'il s'agit d'un travail de nettoyage ponctuel, vous devriez pouvoir exécuter les requêtes à partir de la console. mais si vous cherchez un emploi de recrutement, vous devriez probablement prendre ce code et le mettre dans une procédure.

Remarque :ici, j'utilise des tables MEMORY TEMPORARY pour de meilleures performances. Vous pouvez rencontrer un problème indiquant "La table est pleine" c'est parce que vous avez trop d'enregistrements. alors vous pouvez augmenter la valeur max_heap_table_size pour la sessionquelque chose comme

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

Cela vous donnera votre valeur actuelle

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