Mysql
 sql >> база данни >  >> RDS >> Mysql

Ако имам MySQL таблица с множество еднакви стойности на колони, как да изтрия всички, освен два от най-новите записи?

Това може да е решение на проблема ви.

Въпреки това, тъй като няма колона за дата и час, предполагам, че колоната id е първичният ключ. И това е Auto_increment . Така че моето предположение е, че колкото по-голямо е числото, толкова по-нов е записът. (трябва да е вярно, освен ако не сте имали някои стари дъмпове на данни в таблицата)

Уверете се, че сте архивирали данните си, преди да ги изтриете, тъй като това ще доведе до трайна загуба на данни. Още по-добре, можете да направите копие на текущата таблица в друга таблица и да работите върху новата таблица, за да сте сигурни, че логиката по-долу е правилна. След това променете заявките, които имам по-долу, за да чета от tbl_new вместо това на tbl

можете да дублирате вашата таблица чрез нещо като

CREATE TABLE tbl_new LIKE tbl;

Оставих коментари за всяко запитване

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

ако това е еднократна задача за почистване, тогава трябва да можете да изпълнявате заявките от конзолата. но ако търсите работа за набиране на персонал, вероятно трябва да вземете този код и да го поставите в процедура.

Забележка:тук използвам таблици MEMORY TEMPORARY за по-добра производителност. Може да срещнете проблем, който казва "Таблицата е пълна" това е защото имате твърде много записи. тогава можете да увеличите стойността max_heap_table_size за сесията, нещо като

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

Това ще ви даде текущата ви стойност

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. Не може да се види mySQL COUNT от 3-та таблица

  2. Как да конвертирам човешка дата в unix времева марка в Mysql?

  3. Грешка при изграждане на програма с mysql конектор

  4. PHP Предупреждение:Стартиране на PHP:Не може да се зареди динамична библиотека 'pdo_mysql.so'

  5. Magento Mass Import изображения с MAGMI - изображенията са изключени