Cảnh báo của trình chỉnh sửa:Giải pháp này không hiệu quả về mặt tính toán và có thể làm hỏng kết nối của bạn cho một bảng lớn.
NB - Bạn cần để thực hiện việc này trước tiên trên bản sao thử nghiệm trên bàn của bạn!
Khi tôi làm điều đó, tôi thấy rằng trừ khi tôi cũng bao gồm AND n1.id <> n2.id
, nó đã xóa mọi hàng trong bảng.
-
Nếu bạn muốn giữ hàng có
id
thấp nhất giá trị:DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
-
Nếu bạn muốn giữ hàng có
id
cao nhất giá trị:DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Tôi đã sử dụng phương pháp này trong MySQL 5.1
Không chắc chắn về các phiên bản khác.
Cập nhật:Vì mọi người trên Google để xóa các bản sao đều kết thúc ở đây
Mặc dù câu hỏi của OP là về DELETE
, xin lưu ý rằng sử dụng INSERT
và DISTINCT
nhanh hơn nhiều. Đối với cơ sở dữ liệu có 8 triệu hàng, truy vấn dưới đây mất 13 phút trong khi sử dụng DELETE
, mất hơn 2 giờ mà vẫn chưa hoàn thành.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;