sql >> Databáze >  >> RDS >> Mysql

Pokud mám tabulku MySQL s více stejnými hodnotami sloupce, jak odstraním všechny nejnovější položky kromě dvou?

Toto může být řešením vašeho problému.

Protože však neexistuje sloupec data a času, předpokládám, že sloupec id je primární klíč. A je to Auto_increment . Takže můj předpoklad je, že čím větší číslo, tím novější záznam. (měla by to být pravda, pokud jste do tabulky neměli nějaké staré výpisy dat)

Před smazáním se ujistěte, že jste svá data zálohovali, protože to způsobí trvalou ztrátu dat. Ještě lepší je, že můžete vytvořit kopii aktuální tabulky do jiné tabulky a pracovat na nové tabulce, abyste se ujistili, že níže uvedená logika je správná. Poté změňte dotazy, které mám níže, na čtení z tbl_new místo toho na tbl

můžete duplikovat svůj stůl pomocí něčeho jako

CREATE TABLE tbl_new LIKE tbl;

Zanechal jsem komentáře ke každému dotazu

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

pokud se jedná o jednorázovou úlohu čištění, měli byste být schopni provádět dotazy z konzoly. ale pokud pro ně hledáte náborovou práci, pravděpodobně byste měli vzít tento kód a vložit jej do postupu.

Poznámka:zde používám tabulky MEMORY TEMPORARY pro lepší výkon. Můžete narazit na problém, který říká „Tabulka je plná“ je to proto, že máte příliš mnoho záznamů. pak můžete zvýšit hodnotu max_heap_table_size pro relaci něco jako

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

Tím získáte svou aktuální hodnotu

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


  1. Jak zpracovat datum 0000-00-00 v dotazu jdbc MySQL

  2. Jak mám uložit GUID v Oracle?

  3. Ignorovat duplicitní klíč?

  4. inicializujte mysql pomocí funkce Windows API CreateProcessA