با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، و کاربرانی که دوره آموزش MySQL را دنبال می کنند. به طور کلی، جداول یا مجموعه نتایج بعضی اوقات حاوی داده های تکراری هستند. این در اغلب موارد مجاز است، اما گاهی لازم است که رکوردهای تکراری را متوقف کند. لازم است که رکوردهای تکراری را شناسایی کرده و آنها را از جدول حذف کنید. در این بخش مدیریت موارد تکراری در MySQL ، نحوه جلوگیری از وقوع رکوردهای تکراری در یک جدول و نحوه حذف رکوردهای تکراری موجود را توضیح می دهیم.
در ادامه ی این آموزش شما را با چگونگی مدیریت موارد تکراری در MySQL آشنا می کنیم.
می توان یک کلید اصلی یا یک Index یکتا را در یک جدول با فیلدهای مناسب برای متوقف کردن رکوردهای دوگانه استفاده کرد.
جدول زیر شامل index یا کلید اصلی نمی باشد، بنابراین اجازه ی درج داده های تکراری در first_name و last_name داده شده است:
1 2 3 4 5 | CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) ); |
برای جلوگیری از رکوردهای تکراری از یک کلید اصلی برای تعریف آن اضافه کنید.
وقتی این کار را انجام می دهید، لازم است که ستون های NOT NULL را اعلام کنیم، زیرا PRIMARY KEY به مقادیر NULL اجازه نمی دهد:
1 2 3 4 5 6 | 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) ); |
وقتی جدولی شامل یک index یکتا می باشد افزودن مقادیر تکراری به آن index موجب بروز خطا می شود.
برای جلوگیری از اعلام خطای موراد تکراری در index یکتا از دستور INSERT IGNORE به جای دستور INSERT استفاده کنید.
اگر رکوردی رکورد دیگری را کپی نمی کند پس MySQL آن را به طور معمولی قرار داده است.
اگر رکوردی تکراری باشد کلمه ی کلیدی IGNORE به MySQL اعلام می کند که آن مقدار را بدون اعلام خطا نادیده بگیرد.
مثال زیر هیچ خطایی برای درج موارد تکراری در فیلدهای یکتا اعلام نکرده و از درج موراد تکراری جلوگیری می شود:
1 2 3 4 5 6 7 | 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) |
همچنین از کلمه کلیدی REPLACE به جای INSERT استفاده کنید.
در این حالت اگر مقدار جدید تکراری باشد، جایگزین مقدار قبلی خواهد شد:
1 2 3 4 5 6 7 | mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 1 row affected (0.00 sec) mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 2 rows affected (0.00 sec) |
دستور INSERT IGNORE اولین مجموعه ای از رکوردهای تکراری را حفظ کرده و باقی مانده را از بین می برد.
دستور REPLACE آخرین مجموعه ی از تکراری ها را حفظ کرده و هر گونه اطلاعات قبلی را پاک می کند.
راه های دیگر ایجاد فیلد یکتا استفاده از UNIQUE به جای PRIMARY KEY در یک جدول است:
1 2 3 4 5 6 | CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10) UNIQUE (last_name, first_name) ); |
مثال زیر یک query است که رکوردهای تکراری ایجاد شده در فیلدهای first_name و last_name را شمارش می کند:
1 2 3 4 | mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1; |
این query یک لیست از تمام رکوردهای تکراری در در جدول person_tbl بر می گرداند.
عموما برای شناسایی مجموعه مقادیری که کپی شده اند، مراحل زیر را دنبال کنید:
می توانید از دستور DISTINCT در یک ساختار SELECT برای پیدا کردن رکوردهای یکتای قابل دسترس در یک جدول استفاده کنید:
1 2 3 | mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl -> ORDER BY last_name; |
یک جایگزین برای دستور DISTINCT این است که یک بند GROUP BY را اضافه کنید که ستون هایی را که انتخاب می کنید نام می گیرد.
این برای از بین بردن تکراری ها و انتخاب ترکیبات یکتا از مقادیر مشخص ستون ها استفاده می شود :
1 2 3 | mysql> SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name); |
اگر رکوردهای تکراری در یک جدول دارید و می خواهید تمام رکوردهای تکراری از یک جدول حذف شود، روش زیر را دنبال کنید:
1 2 3 4 5 6 | mysql> CREATE TABLE tmp SELECT last_name, first_name, sex -> FROM person_tbl; -> GROUP BY (last_name, first_name); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl; |
یک روش ساده برای از بین بردن رکوردهای تکراری از یک جدول، یک INDEX یا یک کلید اصلی برای آن جدول است.
حتی اگر همچین جدولی موجود باشد می توانید با افزودن INDEX یکتا یا کلید اصلی موارد تکراری را حذف کنید:
1 2 | mysql> ALTER IGNORE TABLE person_tbl -> ADD PRIMARY KEY (last_name, first_name); |
در حالت عادی جداول ایجاد شده در دیتابیس موارد تکراری را می پذیرد، اما شما به راحتی با روش های گفته شده می توانید برای مدیریت موارد تکراری در MySQL و جلوگیری از درج آن در آینده اقدام کنید.