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;