انتقل إلى محتوى الدرس
الدرس 17
دورة MySQL

قيد التفرد UNIQUE ومنع تكرار القيم في MySQLMySQL UNIQUE Constraint

تعلّم قيد التفرد UNIQUE ومنع تكرار القيم في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

يضمن قيد التفرد UNIQUE عدم تكرار أي قيمة غير فارغة داخل العمود (أو مجموعة الأعمدة) على مستوى الجدول بأكمله. وعند محاولة تخزين قيمة موجودة مسبقاً، يوقف محرك InnoDB العملية فوراً بالخطأ القياسي Error 1062 (23000): Duplicate entry for key:

  • تعدد قيود UNIQUE في الجدول الواحد: يمكن للجدول أن يضم عدة أعمدة فريدة مستقلة في آنٍ واحد (مثل اسم المستخدم، والبريد الإلكتروني، والرقم الوطني).
  • إنشاء فهرس B+Tree تلقائياً: ينشئ MySQL خلف الكواليس فهرساً فريداً لكل قيد UNIQUE للتحقق اللحظي من عدم التكرار دون فحص الجدول كاملاً.
مخطط يوضح قيد UNIQUE المفرد والمركّب وسلوك القيم الفارغة NULL في MySQL 8
SQL
CREATE TABLE users (
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(150) NOT NULL UNIQUE,
    referral_code VARCHAR(20) NULL UNIQUE
);

عند كتابة كلمة UNIQUE بجوار العمود مباشرةً، يولّد MySQL اسماً داخلياً للقيد يطابق اسم العمود. أما في المشاريع الاحترافية فيُفضَّل تعريف القيد باسم صريح عبر الصيغة CONSTRAINT uq_name UNIQUE (column) لتسهيل قراءة رسائل الخطأ وإدارة التعديلات المستقبلية:

SQL
CREATE TABLE courses_catalog (
    course_code VARCHAR(20) NOT NULL,
    slug VARCHAR(120) NOT NULL,
    CONSTRAINT uq_courses_code UNIQUE (course_code),
    CONSTRAINT uq_courses_slug UNIQUE (slug)
);

يفرض قيد UNIQUE المركّب التفرد على مجموعة الأعمدة معاً كزوج واحد؛ فيُسمح بتكرار قيمة العمود الأول بمفرده أو العمود الثاني بمفرده، بشرط ألا تتكرر نفس التركيبة مجتمعةً في صفين:

SQL
CREATE TABLE student_enrollments (
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    semester_code VARCHAR(10) NOT NULL,
    CONSTRAINT uq_student_course_sem
        UNIQUE (student_id, course_id, semester_code)
);

في معيار SQL القياسي ومحرك InnoDB، تمثل NULL قيمة غير معروفة، ولذلك لا تتساوى قيمتا NULL أبداً عند المقارنة. ونتيجةً لذلك يسمح عمود UNIQUE القابل للفراغ بتخزين عدة صفوف تحمل القيمة NULL بينما يمنع تكرار أي قيمة نصية أو رقمية فعلية:

  • إذا كان الحقل إلزامياً وفريداً (مثل البريد الإلكتروني)، اجمع دائماً بين NOT NULL UNIQUE.
  • إذا كان الحقل اختيارياً لكنه لا يقبل التكرار عند إدخاله (مثل الرقم الضريبي الاختياري)، استخدم NULL UNIQUE.
SQL
CREATE TABLE customer_profiles (
    email VARCHAR(150) NOT NULL,
    tax_number VARCHAR(30) NULL,
    CONSTRAINT uq_profile_email UNIQUE (email),
    CONSTRAINT uq_profile_tax UNIQUE (tax_number)
);

يمكنك إضافة قيد تفرد مسمى إلى جدول قائم عبر الأمر ALTER TABLE ... ADD CONSTRAINT ... UNIQUE، واستعراض القيود النشطة بأمر SHOW CREATE TABLE، وحذف القيد عند الحاجة باستخدام اسمه الصريح عبر الصياغة القياسية في MySQL 8 ALTER TABLE ... DROP CONSTRAINT:

SQL
ALTER TABLE customer_profiles
    ADD CONSTRAINT uq_profile_phone UNIQUE (tax_number);

SHOW CREATE TABLE customer_profiles;

ALTER TABLE customer_profiles
    DROP CONSTRAINT uq_profile_phone;

يقارن الجدول التالي بين أنماط تعريف قيد التفرد UNIQUE في MySQL 8:

نمط القيدمثال الصياغةهل يقبل تكرار NULL؟الاستخدام الهندسي الأنسب
قيد UNIQUE مفرد إلزاميemail VARCHAR(150) NOT NULL UNIQUEلا (لوجود NOT NULL)البريد الإلكتروني واسم المستخدم والرابط اللطيف
قيد UNIQUE مفرد اختياريtax_id VARCHAR(30) NULL UNIQUEنعمالرقم الضريبي الاختياري أو رمز الدعوة
قيد UNIQUE مركّبUNIQUE (branch_id, sku_code)نعم (إن لم تفرض NOT NULL)منع تكرار الزوج المركّب مثل تسجيل الطالب في المقرر

ملخص الدرس: تعرفت في هذا الدرس على آلية عمل قيد UNIQUE وفهرس B+Tree المرافق له، وكيفية تسمية القيود المفردة والمركّبة، وسلوك القيم الفارغة NULL، وإدارة قيود التفرد بأمر ALTER TABLE.
الخطوة التالية والدرس القادم: انتقل إلى الدرس التالي لإتقان قيد المفتاح الأساسي PRIMARY KEY والترقيم التلقائي AUTO_INCREMENT ودالة LAST_INSERT_ID().

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أصبحت الآن قادراً على حماية جداول MySQL 8 من تكرار البيانات عبر قيود UNIQUE المفردة والمركّبة. الخطوة التالية: انتقل إلى درس «قيد المفتاح الأساسي PRIMARY KEY والترقيم التلقائي».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات5

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 5 مفهومةأول بطاقة، أول خطوة
01 UNIQUE Key قيد التفرد
تعلّم قيد التفرد UNIQUE ومنع تكرار القيم في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Preventing Duplicates with UNIQUE منع التكرار بقيد UNIQUE
المفهوم الهندسي والصياغة العملية الخاصة بقسم منع التكرار بقيد UNIQUE في MySQL 8.
للمراجعة
03 Named Table UNIQUE Constraints تسمية قيد UNIQUE بالجدول
المفهوم الهندسي والصياغة العملية الخاصة بقسم تسمية قيد UNIQUE بالجدول في MySQL 8.
للمراجعة
04 Composite Multi Column UNIQUE قيد التفرد المركّب UNIQUE
المفهوم الهندسي والصياغة العملية الخاصة بقسم قيد التفرد المركّب UNIQUE في MySQL 8.
للمراجعة
05 How UNIQUE Handles NULL سلوك قيد UNIQUE مع NULL
المفهوم الهندسي والصياغة العملية الخاصة بقسم سلوك قيد UNIQUE مع NULL في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UQ UQ
Unique Constraint Prefix (uq_table_column)
البادئة القياسية المتبعة في تسمية قيود وفهارس التفرد داخل الجداول العلائقية.
للمراجعة
02 SKU SKU
Stock Keeping Unit
رمز تعريف المخزون الفريد للمنتج والذي يُحمى عادةً بقيد UNIQUE في جداول المتاجر.
للمراجعة
03 DDL DDL
Data Definition Language
أوامر تعريف بنية البيانات في SQL المسؤولة عن إنشاء الجداول وإضافة القيود والفهارس.
للمراجعة
04 CI CI
Case-Insensitive Collation (_ci)
نظام مقارنة نصية يعامل الأحرف الكبيرة والصغيرة كقيمة واحدة داخل فهارس UNIQUE.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم منع التكرار بقيد UNIQUE داخل قاعدة بياناتك المحلية وتحقق من النتيجة.

  2. بدّل بين الحالات التفاعلية في قسم تسمية قيد UNIQUE بالجدول وقارن كيف يعالج محرك MySQL 8 كل أمر.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

5أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي5 أسئلة تنتظرك
01

ما رقم الخطأ القياسي الذي يُرجعه خادم MySQL عند محاولة إدخال قيمة مكررة تنتهك قيد UNIQUE؟

يُطلق محرك MySQL الخطأ رقم 1062 (Duplicate entry for key) فور اكتشاف تكرار القيمة في الفهرس الفريد.

02

يمكن لجدول واحد في MySQL أن يحتوي على عدة قيود UNIQUE على أعمدة مختلفة في الوقت نفسه.

صواب؛ يمكن تعريف عدة قيود UNIQUE في الجدول الواحد (مثل اسم المستخدم والبريد الإلكتروني ورقم الهوية).

03

ماذا يفرض القيد المركّب UNIQUE (branch_id, sku_code) داخل الجدول؟

يمنع تكرار نفس الزوج (branch_id, sku_code) معاً، بينما يسمح بظهور رقم الفرع أو رمز المنتج منفرداً في صفوف أخرى.

04

كيف يتعامل عمود UNIQUE القابل للفراغ في محرك InnoDB مع وجود عدة صفوف تحمل القيمة NULL؟

بما أن NULL لا تساوي NULL أخرى منطقياً، يسمح محرك InnoDB بوجود عدة صفوف تحمل القيمة NULL في عمود UNIQUE.

05

أي أمر SQL يحذف قيد التفرد المسمى uq_profile_phone من جدول customer_profiles؟

يُحذف قيد UNIQUE في MySQL بحذف الفهرس الفريد المقابل له عبر ALTER TABLE ... DROP INDEX.