English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
قد تحتوي بعض جداول MySQL على سجلات مكررة، بعض الحالات نسمح بوجود بيانات مكررة، ولكن في بعض الأحيان نحتاج أيضًا إلى حذف هذه البيانات المكررة.
في هذا الفصل سنقدم لكم كيفية منع ظهور بيانات مكررة في جدول البيانات وكيفية حذف البيانات المكررة من جدول البيانات.
يمكنك تعيين حقل معين في جدول MySQL الخاص بك ك PRIMARY KEY (مفتاح رئيسي) أو UNIQUE (فريد) مؤشرات لضمان فريدة من نوعها للبيانات.
لنحاول مثالاً: لا توجد مؤشرات أو مفاتيح رئيسية في الجدول التالي، لذا يسمح الجدول بإدراج سجلات مكررة.
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
إذا كنت ترغب في إعداد حقل first_name، لا يمكن أن يكون حقل last_name مكرراً، يمكنك إعداد نمط مفتاح رئيسي مزدوج لضمان فريدة من نوعها للبيانات. إذا قمت بتعيين مفتاح رئيسي مزدوج، فإن القيمة الافتراضية للمفتاح لا يمكن أن تكون NULL، يمكن تعيينها على NOT NULL. كما هو موضح أدناه:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );
إذا قمنا بتعيين مؤشر فريد، فإن جملة SQL لن تنجح في إدراج البيانات المكررة، وستقوم بطرح خطأ.
الفرق بين INSERT IGNORE INTO و INSERT INTO هو أن INSERT IGNORE INTO يغض الطرف عن البيانات الموجودة بالفعل في قاعدة البيانات، إذا لم يكن هناك بيانات في قاعدة البيانات، يتم إدراج البيانات الجديدة، وإذا كانت هناك بيانات، يتم تخطي هذا السجل. بهذا يمكن الحفاظ على البيانات الموجودة بالفعل في قاعدة البيانات، وتحقيق هدف إدراج البيانات في الفجوات.
استخدمت هذه الأمثلة INSERT IGNORE INTO، لن يتم عرض خطأ عند تنفيذها ولن يتم إدراج بيانات مكررة في جدول البيانات:
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES('Jay', 'Thomas'); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES('Jay', 'Thomas'); Query OK, 0 rows affected (0.00 sec)
INSERT IGNORE INTO عند إدراج البيانات، إذا تم إدراج بيانات مكررة بعد إعداد فريدة من نوعها للسجلات، لن يتم عرض خطأ، بل سيتم عرض تحذير فقط. بينما REPLACE INTO إذا كان هناك سجلات primary أو unique متطابقة، يتم حذفها أولاً قبل إدراج السجلات الجديدة.
يمكنك أيضًا إعداد فريدة من نوعها للبيانات عن طريق إضافة índice UNIQUE، مثلما هو موضح أدناه:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), UNIQUE (last_name, first_name) );
سنقوم فيما يلي بتتبع عدد السجلات المكررة لـ first_name و last_name في الجدول:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> from person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
ستقوم الجملة التالية بالعودة إلى عدد السجلات المكررة في جدول person_tbl. في معظم الحالات، للبحث عن القيم المكررة، قم بتنفيذ ما يلي:
تحديد أي عمود يحتوي على قيم قد تكرر.
في قائمة اختيار الأعمدة المدرجة باستخدام COUNT(*).
في الأعمدة المدرجة في جملة GROUP BY.
يُستخدم جملة HAVING لضبط عدد التكرارات أكبر من 1.
إذا كنت بحاجة إلى قراءة البيانات المكررة، يمكنك استخدام كلمة المفتاح DISTINCT في جملة SELECT لفصل البيانات المكررة.
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl;
يمكنك أيضًا استخدام GROUP BY لقراءة البيانات المكررة في جدول البيانات:
mysql> select last_name, first_name -> from person_tbl -> group by (last_name, first_name);
إذا كنت ترغب في حذف البيانات المكررة في جدول البيانات، يمكنك استخدام الجملة SQL التالية:
mysql> إنشاء TABLE tmp select last_name, first_name, sex from person_tbl group by (last_name, first_name, sex); mysql> حذف TABLE person_tbl; mysql> تعديل TABLE tmp rename to person_tbl;
بالطبع يمكنك أيضًا إضافة INDEX (السجل) و PRIMAY KEY (المفتاح الرئيسي) بهذه الطريقة البسيطة لإزالة السجلات المكررة في جدول البيانات. الطريقة كالتالي:
mysql> تعديل TABLE person_tbl -> إضافة مفتاح رئيسي رئيسي (last_name, first_name);