mysql - حذف - كيفية انشاء جدول في sql




هل تريد حذف جميع الصفوف المكررة باستثناء واحدة في MySQL؟ (2)

ممكن تكرار:
أزل الصفوف المكررة في MySQL

كيف يمكنني حذف جميع البيانات المكررة من جدول MySQL؟

على سبيل المثال ، مع البيانات التالية:

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

أود استخدام SELECT DISTINCT name FROM names; إذا كان استعلام SELECT .

كيف أقوم بذلك مع DELETE لإزالة النسخ المكررة فقط واحتفظ بسجل واحد فقط لكل منها؟


إذا كنت تريد الاحتفاظ بالصف بقيمة id أقل:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

إذا كنت تريد أن تكون قيمة id الأعلى:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

يعد طلب البحث الفرعي في طلب البحث الفرعي ضروريًا لـ MySQL ، أو ستحصل على خطأ 1093.


ملحوظة: تحتاج إلى القيام بذلك أولاً على نسخة اختبار من الجدول الخاص بك!

عندما فعلت ذلك ، وجدت أنه ما لم أدرج أيضا AND n1.id <> n2.id ، فإنه حذف كل صف في الجدول.

1) إذا كنت تريد الاحتفاظ بالصف بقيمة id أقل:

DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name

2) إذا كنت تريد الاحتفاظ بالصف بأعلى قيمة id :

DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name

لقد استخدمت هذه الطريقة في MySQL 5.1

غير متأكد من الإصدارات الأخرى.

تحديث: نظرًا لأن الأشخاص الذين يبحثون عن Googling لإزالة العناصر المكررة في نهاية المطاف هنا
على الرغم من أن سؤال OP هو حول DELETE ، يرجى أخذ العلم بأن استخدام INSERT و DISTINCT أسرع بكثير. بالنسبة لقاعدة بيانات تحتوي على 8 ملايين صف ، استغرق الاستعلام أدناه 13 دقيقة ، بينما كان استخدام DELETE يستغرق أكثر من ساعتين ولم يكتمل بعد.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;




duplicates