کامپیوتر , مهندسی 287 بازدید

به طور کلی جدول‌ها یا مجموعه نتایج حاصل از کوئری‌ها، گاهی اوقات شامل رکوردهای تکراری هستند. در اغلب موارد این وضعیت مجاز است، اما در پاره‌ای موارد نیز لازم است که رکوردهای تکراری حذف شوند. بدین ترتیب باید رکوردهای تکراری شناسایی شده و از جدول حذف شوند. در این بخش از سلسله مطالب راهنمای جامع MySQL به توصیف روش جلوگیری از رخداد رکوردهای مکرر در یک جدول و شیوه حذف رکوردهای از قبل موجود می‌پردازیم.

اجتناب از ایجاد رکوردهای مکرر در یک جدول

می‌توان از اندیس یکتا (UNIQUE) یا یک PRIMARY KEY روی جدول با فیلدهای مناسب برای جلوگیری از ایجاد رکوردهای تکراری استفاده کرد.

در ادامه مثالی را بررسی می‌کنیم. در جدول زیر هیچ اندیس یا PRIMARY KEY وجود ندارد و از این رو امکان ایجاد رکوردهای تکراری برای first_name و last_name وجود دارد.

برای جلوگیری از ایجاد رکوردهای چندگانه با نام و نام خانوادگی یکسان در این جدول می‌توان یک PRIMARY KEY به تعریف آن اضافه کرد. بدین ترتیب لازم است که ستون‌های اندیس‌دار غیر Null باشند، چون PRIMARY KEY امکان ایجاد مقادیر Null را نمی‌دهد.

با وجود یک اندیس یکتا در یک جدول در صورتی که رکوردی را در جدول درج کنید که نسخه تکراری از یک رکورد موجود در ستون یا ستون‌هایی که اندیس روی آن تعریف شده، باشد، به طور معمول منجر به یک خطا می‌شود.

دستور NSERT IGNORE

در چنین حالتی می‌توان از دستور INSERT IGNORE به جای دستور INSERT استفاده کرد. اگر یک رکورد، نسخه‌ای تکراری از رکورد از قبل موجود نباشد، در این صورت MySQL آن را به طور معمول درج می‌کند؛ اما اگر تکراری باشد، در این صورت کلیدواژه IGNORE به MySQL می‌گوید که آن را بدون صدور هیچ خطایی رد کند.

در مثال زیر هیچ خطایی ایجاد نمی‌شود و همزمان رکوردهای تکراری نیز در جدول درج نمی‌شوند.

دستور REPLCAE

می‌توان از دستور REPLCAE به جای دستور INSERT استفاده کرد. اگر رکورد جدید باشد، همانند زمان استفاده از دستور INSERT درج می‌شود؛ اما اگر تکراری باشد، رکورد جدید جایگزین رکورد قبلی می‌شود.

دستورهای INSERT IGNORE و REPLACE بسته به رفتاری که با رکوردهای تکراری می‌خواهیم داشته باشیم، باید انتخاب شوند. دستور INSERT IGNORE رکورد قبلی را نگه می‌دارد و رکورد جدید را نادیده می‌گیرد. دستور REPLCAE نسخه جدید تکراری را درج می‌کند و نسخه قدیمی را پاک می‌کند.

روش دیگر برای الزام یکتا بودن این است که به جای یک PRIMARY KE، یک اندیس UNIQUE به جدول اضافه کنیم:

شمارش و شناسایی موارد تکراری

در کوئری زیر تعداد رکوردهای تکراری که دارای نام و نام خانوادگی مشابهی هستند در یک جدول شمارش می‌شود:

این کوئری لیستی از همه رکوردهای تکراری در جدول person_tbl بازمی‌گرداند. به طور کلی برای شناسایی مجموعه مقادیر تکراری باید از مراحل زیر استفاده کنید:

  • تعیین این که کدام ستون شامل مقادیری است که ممکن است تکراری باشند.
  • لیست کردن ستون‌هایی در لیست انتخاب ستون همراه با COUNT(*)
  • باید ستون‌ها در بند GROUP BY نیز لیست شوند.
  • یک بند HAVING اضافه می‌شود که مقادیر یکتا را با الزام تعداد گروه‌ها برای بزرگ‌تر از 1 بودن حذف می‌کند.

حذف موارد تکراری از نتیجه کوئری

می‌توانید از دستور DISTINCT همراه با عبارت SELECT برای یافتن رکوردهای یکتای موجود در یک جدول استفاده کنید.

جایگزین دیگر برای دستور DISTINCT، افزودن بند GROUP BY است که ستون‌های انتخابی را مشخص می‌کند. بدین ترتیب موارد تکراری حذف می‌شوند و تنها ترکیب‌های یکتای مقادیر در ستون‌های مشخص شده انتخاب می‌شوند:

حذف موارد تکراری با استفاده از جایگزینی جدول

اگر رکوردهای تکراری در یک جدول وجود داشته باشند و بخواهیم همه رکوردهای تکراری را از جدول حذف کنیم، می‌توانیم از رویه زیر استفاده کنیم:

یک روش آسان برای حذف موارد تکراری از یک جدول ابن است که یک INDEX یا یک PRIMARY KEY به آن جدول اضافه کنیم. حتی اگر جدول از قبل تشکیل یافته باشد می‌توان از این تکنیک برای حذف رکوردهای تکراری و امن نگه‌داشتن آن در آینده استفاده کرد.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

به عنوان حامی، استارتاپ، محصول و خدمات خود را در انتهای مطالب مرتبط مجله فرادرس معرفی کنید.

telegram
twitter

میثم لطفی

«میثم لطفی» دانش‌آموخته کارشناسی ریاضیات کاربردی و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری همه علاقه‌مندی‌های خود در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و تولید محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

2 نظر در “مدیریت رکوردهای تکراری در MySQL — راهنمای جامع

    1. سلام و وقت بخیر
      این موردی که شما خواسته‌اید بحث بسیار گسترده‌ای است. بسته به کتابخانه‌های مختلف، کاربردهای گوناگون و کدبیس کنونی، می‌توان اسکریپت‌های PHP متفاوتی برای عدم درج رکورد تکراری نوشت که البته نیازمند آشنایی با پروژه است. فلذا این کار متاسفانه برای ما مقدور نیست.
      با تشکر.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *