Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nếu tôi có một bảng MySQL với nhiều giá trị cột giống nhau, làm cách nào để xóa tất cả trừ hai trong số các mục nhập gần đây nhất?

Đây có thể là một giải pháp cho vấn đề của bạn.

Tuy nhiên, vì không có cột ngày-giờ nên tôi giả định rằng cột id là khóa chính. Và nó là Auto_increment . Vì vậy, giả định của tôi là số càng lớn thì bản ghi càng mới. (nó phải đúng trừ khi bạn có một số dữ liệu cũ được đưa vào bảng)

Đảm bảo rằng bạn đã sao lưu dữ liệu của mình trước khi xóa vì điều này sẽ khiến bạn bị mất dữ liệu vĩnh viễn. Tốt hơn nữa, bạn có thể tạo một bản sao của bảng hiện tại thành một bảng khác và làm việc trên bảng mới để đảm bảo logic bên dưới là chính xác. Sau đó, thay đổi các truy vấn mà tôi có bên dưới để đọc từ tbl_new thay vào đó trên tbl

bạn có thể sao chép bảng của mình thông qua một cái gì đó như

CREATE TABLE tbl_new LIKE tbl;

Tôi đã để lại nhận xét cho mọi truy vấn

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

nếu đây là công việc dọn dẹp một lần thì bạn sẽ có thể thực hiện các truy vấn từ bảng điều khiển. nhưng nếu bạn đang tìm kiếm một Công việc tuyển dụng cho họ, bạn có thể nên lấy mã này và đưa nó vào một quy trình.

Lưu ý:ở đây tôi đang sử dụng bảng TẠM THỜI BỘ NHỚ để có hiệu suất tốt hơn. Bạn có thể gặp sự cố cho biết "Bảng đã đầy" điều này là do bạn có quá nhiều hồ sơ. thì bạn có thể tăng giá trị max_heap_table_size cho các phiên như

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

Điều này sẽ cung cấp cho bạn giá trị hiện tại của bạn

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. Cách quản lý cơ sở dữ liệu của bạn với Adminer

  2. Việc đóng tập kết quả phát trực tuyến (sử dụng mysql jdbc) mất nhiều thời gian

  3. Làm cách nào để nhận kết quả của hai câu lệnh select trong một hàng?

  4. Làm cách nào để tạo định dạng json với mysql group-concat?

  5. Hiệu suất Nhiều lần chèn hoặc nhiều giá trị chèn một lần