MySQL - Xóa các bản ghi trùng lặp

Xin chào các bạn tương lai trở thành phù thủy cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới của MySQL, cụ thể là cách xóa bỏ những bản ghi trùng lặp phiền phức. Là người dạy máy tính hàng xóm thân thiện của bạn, tôi sẽ hướng dẫn bạn qua quy trình này từng bước, đảm bảo bạn hiểu rõ từng chi tiết. Vậy, cầm lấy cây chổi ảo của bạn, và cùng chúng tôi dọn dẹp cơ sở dữ liệu nhé!

MySQL - Delete Duplicate Records

Xóa các bản ghi trùng lặp trong MySQL

Trước khi chúng ta bắt đầu vào phần chi tiết của việc xóa các bản ghi trùng lặp, hãy cùng dành một chút thời gian để hiểu tại sao điều này lại quan trọng. Hãy tưởng tượng bạn đang quản lý cơ sở dữ liệu thư viện, và một cách nào đó, bạn đã có nhiều bản ghi trùng lặp của cùng một sách. Điều này không chỉ lãng phí không gian mà còn có thể gây ra sự nhầm lẫn và lỗi. Đó là lúc 操作 xóa các bản ghi trùng lặp của chúng ta phát huy tác dụng!

Bản ghi trùng lặp là gì?

Bản ghi trùng lặp là các mục trong bảng cơ sở dữ liệu có giá trị giống hệt nhau trong một hoặc nhiều cột. Trong ví dụ thư viện của chúng ta, đây có thể là các sách có cùng số ISBN, tác giả và tiêu đề.

Tìm giá trị trùng lặp

Trước khi chúng ta có thể xóa các bản ghi trùng lặp, chúng ta cần phải tìm ra chúng trước. Điều này giống như chơi trò "tìm sự khác biệt", nhưng ngược lại! Hãy cùng nhìn qua một số phương pháp để xác định các bản ghi trùng lặp.

Sử dụng GROUP BY và các mệnh đề HAVING

SELECT column_name, COUNT(*) as count
FROM table_name
GROUP BY column_name
HAVING count > 1;

Truy vấn này nhóm các bản ghi theo cột được chỉ định và đếm số lần mỗi giá trị xuất hiện. Mệnh đề HAVING lọc ra các nhóm có số lần xuất hiện lớn hơn 1, hiệu quả là hiển thị các giá trị trùng lặp.

Ví dụ, nếu chúng ta đang tìm kiếm các sách trùng lặp trong thư viện của chúng ta:

SELECT title, author, COUNT(*) as count
FROM books
GROUP BY title, author
HAVING count > 1;

Truy vấn này sẽ hiển thị tất cả các tiêu đề sách và tác giả xuất hiện hơn một lần trong cơ sở dữ liệu của chúng ta.

Sử dụng Self JOIN

Một phương pháp khác để tìm trùng lặp là sử dụng một.self JOIN:

SELECT t1.*
FROM table_name t1
JOIN table_name t2
WHERE t1.id < t2.id
AND t1.column_name = t2.column_name;

Truy vấn này nối bảng với chính nó và so sánh mỗi bản ghi với tất cả các bản ghi khác. Nó trả về tất cả các bản ghi trùng lặp ngoại trừ bản ghi có ID cao nhất.

Xóa các bản ghi trùng lặp

Bây giờ chúng ta đã tìm thấy các bản ghi trùng lặp, đã đến lúc bid chúng farewell. Có nhiều cách để làm điều này, mỗi cách có những ưu và nhược điểm riêng. Hãy cùng khám phá!

Sử dụng DELETE với Subquery

DELETE t1 FROM table_name t1
INNER JOIN table_name t2
WHERE t1.id < t2.id
AND t1.column_name = t2.column_name;

Truy vấn này xóa tất cả các bản ghi trùng lặp ngoại trừ bản ghi có ID cao nhất. Đó như một trò chơi ghế dựa, nơi bản ghi cuối cùng đứng lại được phép ở lại!

Sử dụng CREATE TABLE và INSERT

Một phương pháp khác là tạo một bảng mới với các bản ghi duy nhất và sau đó thay thế bảng gốc:

CREATE TABLE temp_table AS
SELECT DISTINCT * FROM original_table;

DROP TABLE original_table;

ALTER TABLE temp_table RENAME TO original_table;

Phương pháp này giống như tạo một bản sao của danh sách nhạc yêu thích của bạn, nhưng chỉ giữ một phiên bản của mỗi bài hát.

Sử dụng ROW_NUMBER()

Đối với người dùng nâng cao, chúng ta có thể sử dụng hàm ROW_NUMBER():

DELETE FROM table_name
WHERE id NOT IN (
SELECT id
FROM (
SELECT id,
ROW_NUMBER() OVER (
PARTITION BY column_name
ORDER BY id
) AS row_num
FROM table_name
) t
WHERE t.row_num = 1
);

Hàm này gán một số thứ tự cho mỗi bản ghi trong các nhóm giá trị giống hệt nhau, sau đó xóa tất cả các hàng ngoại trừ hàng đầu tiên trong mỗi nhóm.

Xóa các bản ghi trùng lặp bằng chương trình khách

Đôi khi, việc xử lý xóa trùng lặp ngoài MySQL dễ dàng hơn. Dưới đây là một đoạn mã Python đơn giản có thể giúp bạn:

import mysql.connector

def delete_duplicates(connection, table_name, column_name):
cursor = connection.cursor()

# Tìm và xóa trùng lặp
query = f"""
DELETE t1 FROM {table_name} t1
INNER JOIN {table_name} t2
WHERE t1.id < t2.id
AND t1.{column_name} = t2.{column_name}
"""

cursor.execute(query)
connection.commit()

print(f"Đã xóa {cursor.rowcount} bản ghi trùng lặp.")

# Ví dụ sử dụng
connection = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="yourdatabase"
)

delete_duplicates(connection, "books", "isbn")

connection.close()

Đoạn mã này kết nối với cơ sở dữ liệu MySQL của bạn, thực thi truy vấn xóa và báo cáo số lượng bản ghi trùng lặp đã bị xóa. Đó như có một trợ lý cá nhân để dọn dẹp cơ sở dữ liệu của bạn!

Kết luận

Chúc mừng! Bạn đã học được nhiều phương pháp để tìm và xóa các bản ghi trùng lặp trong MySQL. Nhớ rằng, duy trì một cơ sở dữ liệu sạch, không có trùng lặp là rất quan trọng cho tính toàn vẹn dữ liệu và hoạt động hiệu quả.

Dưới đây là tóm tắt nhanh về các phương pháp chúng ta đã xem xét:

Phương pháp Ưu điểm Nhược điểm
GROUP BY và HAVING Dễ hiểu Chỉ tìm trùng lặp, không xóa
Self JOIN Linh hoạt, có thể so sánh nhiều cột Có thể chậm trên bảng lớn
DELETE với Subquery Hiệu quả cho bảng nhỏ đến trung bình Có thể chậm trên bảng rất lớn
CREATE TABLE và INSERT Giữ lại dữ liệu gốc Cần không gian lưu trữ tạm thời
ROW_NUMBER() Rất linh hoạt và mạnh mẽ Cú pháp phức tạp
Chương trình khách Có thể tích hợp logic tùy chỉnh Cần lập trình bổ sung

Chọn phương pháp phù hợp nhất với nhu cầu cụ thể và kích thước cơ sở dữ liệu của bạn. Và nhớ sao lưu dữ liệu trước khi thực hiện các thao tác xóa. Chúc bạn thành công trong việc dọn dẹp!

Credits: Image by storyset