Xóa dữ liệu trùng trong mysql
Tôi có một bảng với các trường sau: Show
Bây giờ, tôi cần xóa các hàng có cùng
Sau khi chạy truy vấn này, tôi có thể loại bỏ các bản sao bằng cách sử dụng tập lệnh phía máy chủ. Nhưng, tôi muốn biết nếu điều này có thể được thực hiện chỉ bằng cách sử dụng truy vấn SQL. Một cách thực sự dễ dàng để làm điều này là thêm chỉ mục
Điều này sẽ thả tất cả các hàng trùng lặp. Là một lợi ích bổ sung, tương lai The most convenient and reliable file storage service Receive your personal cloud storage with 2Gb of space for free Nếu bạn không muốn thay đổi các thuộc tính cột, thì bạn có thể sử dụng truy vấn bên dưới. Vì bạn có một cột có ID duy nhất (ví dụ: cột
Trong MySQL, bạn có thể đơn giản hóa nó nhiều hơn với toán tử bằng NULL-safe (aka "toán tử tàu vũ trụ" ):
MySQL có các hạn chế về việc tham khảo bảng bạn đang xóa. Bạn có thể làm việc xung quanh đó với một bảng tạm thời, như:
Từ đề xuất của Kostanos trong các bình luận:
Nếu câu lệnh
Có một giải pháp khác:
Flexible, reliable and affordable cloud hosting Sign up and get $50 bonus within 30-day! Xóa các bản sao trên các bảng MySQL là một vấn đề phổ biến, đó là kết quả của một ràng buộc bị thiếu để tránh các bản sao đó trước khi xử lý. Nhưng vấn đề phổ biến này thường đi kèm với các nhu cầu cụ thể ... đòi hỏi phải có các phương pháp cụ thể. Cách tiếp cận nên khác nhau tùy thuộc vào, ví dụ, kích thước của dữ liệu, mục nhập trùng lặp nên được giữ (nói chung là đầu tiên hoặc cuối cùng), cho dù có giữ các chỉ mục hay chúng tôi muốn thực hiện bất kỳ bổ sung nào hành động trên dữ liệu trùng lặp. Ngoài ra còn có một số đặc điểm cụ thể trên MySQL, chẳng hạn như không thể tham chiếu cùng một bảng với nguyên nhân TỪ khi thực hiện bảng CẬP NHẬT (nó sẽ gây ra lỗi MySQL # 1093). Hạn chế này có thể được khắc phục bằng cách sử dụng truy vấn bên trong với bảng tạm thời (như được đề xuất trên một số phương pháp ở trên). Nhưng truy vấn bên trong này sẽ không thực hiện đặc biệt tốt khi xử lý các nguồn dữ liệu lớn. Tuy nhiên, một cách tiếp cận tốt hơn tồn tại để loại bỏ các bản sao, điều đó vừa hiệu quả vừa đáng tin cậy và có thể dễ dàng thích nghi với các nhu cầu khác nhau. Ý tưởng chung là tạo một bảng tạm thời mới, thường thêm một ràng buộc duy nhất để tránh trùng lặp thêm và để XÁC NHẬN dữ liệu từ bảng cũ của bạn sang bảng mới, trong khi chăm sóc các bản sao. Cách tiếp cận này dựa trên các truy vấn MySQL INSERT đơn giản, tạo ra một ràng buộc mới để tránh trùng lặp thêm và bỏ qua nhu cầu sử dụng truy vấn bên trong để tìm kiếm các bản sao và bảng tạm thời nên được giữ trong bộ nhớ (do đó cũng phù hợp với các nguồn dữ liệu lớn). Đây là cách nó có thể đạt được. Cho rằng chúng ta có một bảng staff, với các cột sau:
Để xóa các hàng có cột ssn trùng lặp và chỉ giữ lại mục nhập đầu tiên được tìm thấy, có thể thực hiện quy trình sau:
Giải thích kỹ thuật
⇒ Sử dụng phương pháp này, các thanh ghi 1.6M đã được chuyển đổi thành 6k trong vòng chưa đầy 200 giây. Chetan , theo quy trình này, bạn có thể nhanh chóng và dễ dàng xóa tất cả các bản sao của mình và tạo một ràng buộc ĐỘC ĐÁO bằng cách chạy:
Tất nhiên, quá trình này có thể được sửa đổi thêm để điều chỉnh nó cho các nhu cầu khác nhau khi xóa các bản sao. Một số ví dụ sau đây. ✔ Biến thể để giữ mục cuối cùng thay vì mục đầu tiênĐôi khi chúng ta cần giữ mục trùng lặp cuối cùng thay vì mục đầu tiên.
✔ Biến thể để thực hiện một số tác vụ trên các bản sao, ví dụ: giữ số lượng trên các bản sao được tìm thấyĐôi khi chúng ta cần thực hiện một số xử lý tiếp theo đối với các mục trùng lặp được tìm thấy (chẳng hạn như giữ một số lượng trùng lặp).
✔ Biến thể để tạo lại id trường tăng tự độngĐôi khi chúng tôi sử dụng trường tăng tự động và để giữ cho chỉ số càng nhỏ gọn càng tốt, chúng tôi có thể tận dụng việc xóa các bản sao để tạo lại trường tăng tự động trong bảng tạm thời mới.
✔ Các biến thể khácNhiều sửa đổi hơn nữa cũng có thể thực hiện được tùy thuộc vào hành vi mong muốn. Ví dụ: các truy vấn sau sẽ sử dụng bảng tạm thời thứ hai để, ngoài 1) giữ mục nhập cuối cùng thay vì mục đầu tiên; và 2) tăng bộ đếm trên các bản sao được tìm thấy; cũng 3) tạo lại id trường tăng tự động trong khi vẫn giữ thứ tự nhập như trên dữ liệu cũ.
Tôi có đoạn mã truy vấn này cho SQLServer nhưng tôi nghĩ nó có thể được sử dụng trong các DBMS khác với ít thay đổi:
Tôi quên nói với bạn rằng truy vấn này không xóa hàng có id thấp nhất trong các hàng trùng lặp. Nếu điều này làm việc cho bạn hãy thử truy vấn này:
Đơn giản và nhanh chóng cho mọi trường hợp:
Cách nhanh hơn là chèn các hàng riêng biệt vào một bảng tạm thời. Sử dụng xóa, tôi mất vài giờ để xóa các bản sao khỏi bảng 8 triệu hàng. Sử dụng chèn và khác biệt, chỉ mất 13 phút.
Tôi tiếp tục truy cập trang này bất cứ khi nào tôi google "loại bỏ trùng lặp mẫu mysql" nhưng đối với các giải pháp của chúng tôi không hoạt động vì tôi có bảng mysql của InnoDB mã này hoạt động tốt hơn bất cứ lúc nào
tableToclean = tên của bảng bạn cần xóa tableToclean_temp = một bảng tạm thời được tạo và xóa The most convenient and reliable file storage service Receive your personal cloud storage with 2Gb of space for free Một giải pháp đơn giản để hiểu và hoạt động không có khóa chính: 1) thêm một cột boolean mới
2) thêm một ràng buộc trên các cột trùng lặp VÀ cột mới
3) đặt cột boolean thành true. Điều này sẽ chỉ thành công trên một trong các hàng trùng lặp vì ràng buộc mới
4) xóa các hàng chưa được đánh dấu là tokeep
5) thả cột đã thêm
Tôi đề nghị bạn nên giữ các ràng buộc mà bạn đã thêm, để ngăn chặn các bản sao mới trong tương lai. Giải pháp này sẽ di chuyển các bản sao vào một bảng và uniqu vào bảng khác .
nếu bạn có một bảng lớn với số lượng hồ sơ khổng lồ thì các giải pháp trên sẽ không hoạt động hoặc mất quá nhiều thời gian. Sau đó, chúng tôi có một giải pháp khác nhau
Xóa các hàng trùng lặp bằng cách sử dụng câu lệnh XÓA THAM GIA. Câu lệnh sau sẽ xóa các hàng trùng lặp và giữ id cao nhất:
Tôi tìm thấy một cách đơn giản. (giữ mới nhất)
Flexible, reliable and affordable cloud hosting Sign up and get $50 bonus within 30-day! Kể từ phiên bản 8.0 (2018), cuối cùng MySQL cũng hỗ trợ các chức năng window . Các chức năng của cửa sổ đều tiện dụng và hiệu quả. Dưới đây là một giải pháp cho thấy cách sử dụng chúng để giải quyết nhiệm vụ này. Trong truy vấn con, chúng ta có thể sử dụng
Khi các bản ghi được đánh số đúng trong truy vấn con, truy vấn bên ngoài sẽ xóa tất cả các bản ghi có số hàng không phải là 1. Truy vấn :
Để sao chép các bản ghi với các cột duy nhất, ví dụ: Không nên sao chép COL1, COL2, COL3 (giả sử chúng ta đã bỏ lỡ 3 cột duy nhất trong cấu trúc bảng và nhiều mục trùng lặp đã được thực hiện trong bảng)
Hy vọng sẽ giúp dev. TL; TR;Một hướng dẫn được mô tả rất nhiều để giải quyết vấn đề này có thể được tìm thấy tại mysqltutorial.orgsite: Cách xóa các hàng trùng lặp trong MySQL Nó được hiển thị rất rõ cách xóa các hàng trùng lặp theo ba cách khác nhau: A)Sử dụng câu lệnh B)Sử dụng bảng trung gian C)Sử dụng chức năng Tôi hy vọng rằng nó sẽ giúp được ai đó. Để xóa bản ghi trùng lặp trong một bảng.
hoặc là
|