Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jeśli mam tabelę MySQL z takimi samymi wartościami wielu kolumn, jak mogę usunąć wszystkie najnowsze wpisy poza dwoma?

To może być rozwiązanie Twojego problemu.

Ponieważ jednak nie ma kolumny daty i godziny, zakładam, że kolumna id jest kluczem podstawowym. I to jest Auto_increment . Więc zakładam, że im większa liczba, tym nowszy rekord. (powinno to być prawdą, chyba że masz jakieś stare zrzuty danych w tabeli)

Upewnij się, że wykonałeś kopię zapasową danych przed ich usunięciem, ponieważ spowoduje to trwałą utratę danych. Co więcej, możesz skopiować bieżącą tabelę do innej tabeli i pracować nad nową tabelą, aby upewnić się, że poniższa logika jest poprawna. Następnie zmień zapytania, które mam poniżej, aby odczytać z tbl_new zamiast tego na tbl

możesz zduplikować swój stół za pomocą czegoś takiego jak

CREATE TABLE tbl_new LIKE tbl;

Do każdego zapytania zostawiłem komentarze

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

jeśli jest to jednorazowe zadanie czyszczenia, powinieneś być w stanie wykonać zapytania z konsoli. ale jeśli szukasz pracy rekrutacyjnej, prawdopodobnie powinieneś wziąć ten kod i umieścić go w procedurze.

Uwaga:tutaj używam tabel MEMORY TEMPORARY dla lepszej wydajności. Możesz napotkać problem, który mówi "Tabela jest pełna" dzieje się tak, ponieważ masz zbyt wiele rekordów. następnie możesz zwiększyć wartość max_heap_table_size dla sesjicoś jak

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

To da ci aktualną wartość

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. WSTAW bieżącą datę lub godzinę do MySQL

  2. Przeszukaj kolumnę MySQL z ciągiem JSON pod kątem określonej wartości

  3. Czy istnieje wzór do oszacowania wielkości indeksu w InnoDB?

  4. czy tego rodzaju strukturyzacja SQL (w bazie danych mysql) jest wydajna w modelu świata rzeczywistego?

  5. SQL:porównywanie dwóch liczb z różnych tabel