MySQL có một hạn chế rất đáng ghét mà không thể sử dụng bảng đang được cập nhật/xóa/chèn vào trong một tiểu -lựa chọn.
Nhưng bạn có thể giải quyết vấn đề này bằng cách tham gia bảng để xóa (thay vì sử dụng lựa chọn phụ).
Giả sử bạn có một số loại định danh duy nhất trong bảng của bạn (tôi giả sử một cột id
trong tuyên bố sau):
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT min(id) as min_id, field
FROM table_with_duplicates
GROUP BY field
) keep ON keep.field = d.field
AND keep.min_id <> d.id;
Điều này sẽ giữ một hàng cho mỗi người trong số các bản sao (một với Lowes giá trị trong cột id
).
Nếu bạn muốn xóa tất cả hàng trùng lặp (không lưu giữ ít nhất một), chỉ cần xóa điều kiện AND keep.min_id <> d.id
.
Sửa
Nếu bạn không có một cột duy nhất, nhưng muốn loại bỏ tất cả bản sao (không giữ ít nhất một dòng), sau đó bạn có thể sử dụng:
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT field
FROM table_with_duplicates
GROUP BY field
HAVING count(*) > 1
) del ON del.field = d.field;
Nguồn
2013-01-31 15:10:21
Bạn có nhận được thông báo lỗi hoặc truy vấn chạy thành công không? –
willnt truy vấn của bạn xóa tất cả các lĩnh vực bao gồm cả bản sao? nếu bạn có 2 bản sao với ID đó, truy vấn IN() của bạn sẽ xóa cả hai. Bạn không muốn giữ ít nhất một bản ghi? – GGio
mysql không cho phép bạn cập nhật/xóa trên bảng mà từ đó bạn đang chọn dữ liệu. –