Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jika saya memiliki tabel MySQL dengan beberapa nilai kolom yang sama, bagaimana cara menghapus semua kecuali dua entri terbaru?

Ini mungkin solusi untuk masalah Anda.

Namun, karena tidak ada kolom tanggal-waktu, saya berasumsi bahwa kolom id adalah kunci utama. Dan itu adalah Auto_increment . Jadi asumsi saya adalah semakin besar angkanya, semakin baru rekornya. (seharusnya benar kecuali Anda memiliki beberapa dump data lama ke dalam tabel)

Pastikan Anda membuat cadangan data Anda sebelum Anda menghapus karena ini akan menyebabkan Anda kehilangan data permanen. Lebih baik lagi, Anda dapat membuat salinan tabel saat ini ke tabel lain dan mengerjakan tabel baru untuk memastikan logika di bawah ini benar. Kemudian ubah kueri yang saya miliki di bawah ini untuk dibaca dari tbl_new sebagai gantinya di tbl

Anda dapat menduplikasi tabel Anda melalui sesuatu seperti

CREATE TABLE tbl_new LIKE tbl;

Saya telah meninggalkan komentar untuk setiap pertanyaan

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

jika ini adalah pekerjaan pembersihan satu kali maka Anda harus dapat menjalankan kueri dari konsol. tetapi jika Anda mencari pekerjaan perekrutan mereka, Anda mungkin harus mengambil kode ini dan memasukkannya ke dalam prosedur.

Catatan:di sini saya menggunakan tabel MEMORY SEMENTARA untuk kinerja yang lebih baik. Anda mungkin mengalami masalah yang mengatakan "Tabel Penuh" ini karena Anda memiliki terlalu banyak catatan. maka Anda dapat meningkatkan nilai max_heap_table_size untuk sesi seperti

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

Ini akan memberi Anda nilai Anda saat ini

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. Indeks multi-bahasa dengan Laravel Scout dan Algolia

  2. Apakah mungkin untuk menyimpan gambar, suara, video di SQL Database?

  3. Mengalami masalah saat membuat tabel sementara dari UNION

  4. Dapatkan entri tabel MySQL yang diperbarui dengan python tanpa menutup koneksi

  5. Entity Framework Core Error:Terjadi kesalahan saat menggunakan koneksi ke database '' di server 'localhost'