قيد التفرد في البيانات يفرض تميز قيم عمود أو مجموعة أعمدة بين صفوف الجدول. وهو قاعدة قبول لقيم محددة؛ لا يقدم وحده تفسير السبب الذي جعل سجلين يتشابهان، ولا يختار تلقائيا أيهما يمثل المعلومة الصحيحة. [1]
الخلاصة السريعة
حدد الأعمدة التي يجب ألا تتكرر ومعاملة القيم null في نظامك. إذا خالف سجل القيد، راجع السبب؛ لا تحذفه أو تدمجه بقرار آلي مستنتج من رسالة الرفض وحدها.
- قيد UNIQUE في PostgreSQL يمكن أن يخص عمودا أو تركيبة أعمدة؛ في التركيبة يقارن القيم المختارة معا. [1]
- في ملصقات افتراضية، تكرار الرمز ل2 يخالف اتفاق رمز واحد لكل علبة، لكنه لا يحدد أي سجل يجب تصحيحه.
- في PostgreSQL 18 لا تعد قيمتا null متساويتين افتراضيا لهذا القيد؛ يمكن تغيير ذلك بـNULLS NOT DISTINCT، ولا نعمم على كل نظام. [1]
- تفرد الرمز لا يكشف علبة سجلت برمزين؛ وثق قاعدة الهوية وسياسة التعارض وراجع النتيجة قبل الاستخدام.
أي قيم نقارنها لمنع التكرار؟
في قيد التفرد المركب لدى PostgreSQL، المطلوب تميز تركيبة الأعمدة المختارة؛ قد يتكرر أحد الأعمدة منفردا. [1]
نفترض نظام ملصقات لعلب مجسمات ورقية، ونعلن أن الرمز فريد داخل خزانة واحدة. يمكن اختيار الخزانة والرمز معا إذا سمحنا بتكرار الرمز في خزائن مختلفة. أما إذا كانت القاعدة فريدا في المستودع كله، فالنطاق أوسع. هذه قواعد مثالنا المحلية، وليست أمرا بتصميم جميع قواعد البيانات بالطريقة نفسها.
هل رفض الرمز يخبرنا بالسجل الصحيح؟
تخيل سجلين في الخزانة أ لهما الرمز ل2: الأول يصف علبة مثلثات، والثاني علبة مربعات. إذا اشترط عقدنا عدم تكرار الزوج من الخزانة والرمز، فإن قبولهما معا يخالفه. لكن هذا الوصف لا يكشف هل الرمز خطأ في الأول أم الثاني أم أن العلبة نفسها أعيد وصفها.
نقترح حفظ حالة التعارض، والرجوع إلى بطاقة المصدر أو الشخص المسؤول عن التسجيل. لا نجمع محتويات السجلين ولا نحذف الأقدم بمجرد ترتيب وصولهما. وإذا قررنا التصحيح بعد المراجعة، نسجل السبب والقيمة السابقة. لم ننفذ إدخالا فعليا، ولا ندعي وجود تعارض حقيقي في مستودع.
لماذا نراجع قاعدة null في النظام؟
في PostgreSQL 18، لا تعامل null كمساوية لـnull افتراضيا في قيد UNIQUE، ويمكن استعمال NULLS NOT DISTINCT لتغيير ذلك. تنبه الوثائق إلى اختلاف التنفيذ بين أنظمة قواعد البيانات. [1]
لذلك لا نكتب أن كلمة UNIQUE وحدها تضمن وجود رمز لكل علبة. إذا كان الرمز المطلوب لا يجوز أن يبقى مجهولا، نحدد شرط وجوده أيضا حسب نظامنا وعقدنا. ونراجع نسخة النظام التي نستخدمها قبل تبني صيغة خيار؛ المقال يشرح توثيق PostgreSQL المشار إليه، ولا يقدم ضمانا للتوافق في كل منتج أو إصدار.
ما نوع التكرار الذي يبقى خارج القيد؟
لو سجلت العلبة الافتراضية نفسها مرة بالرمز ل2 ومرة بالرمز ل9، فقد تختلف قيم الرمز رغم أن الشيء المقصود واحد. قيد على الرمز لا يملك معلومة مستقلة عن هوية العلبة الواقعية. بالمقابل، علبتان مختلفتان قد تتشابهان في اللون دون أن تكون إحداهما زائدة.
نوصي بوصف النطاق ومعاملة المجهول وسياسة مراجعة التعارض، ثم فحص التكرار الدلالي بأدلة تناسب المصدر. هذه مراجعة مستقلة عن مجرد اختبار القيد. وفي بيانات نموذج ذكاء اصطناعي، لا نجعل نجاح إدخال الصفوف حكما بأنها تمثل حالات مختلفة أو بيانات دقيقة؛ التفرد يطبق القاعدة التي اخترناها فقط.
المصادر ومتابعة القراءة
- PostgreSQL 18: Constraints — Primary Keys and Unique Constraints (يفتح في نافذة جديدة)postgresql.org
أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.
