الخلية سؤال - مفتاح فريد لا يعمل بشكل صحيح، أو أنا سوء الفهم؟

StackOverflow https://stackoverflow.com/questions/429805

سؤال

وأنا أحاول أن إنشاء علاقة فيها أي من أربعة أجزاء مختلفة يمكن أن تدرج، ولكن ينبغي التعامل مع أي مجموعة من الأجزاء نفسها بأنه فريد من نوعه.

وعلى سبيل المثال: يجب أن يكون للاحالة شركة المعينة، قد يكون اختياريا تعيين المكان، ومجموعة العمل والبرنامج. مهمة قد لا يكون لها عمل دون مكان.

لنفترض لدينا شركات A، B، C، مواقع X، Y، Z، مجموعات العمل I، J، K والبرامج 1 و 2 و 3.

ويمكن أن تشمل العلاقات صالحة حتى A - X - I - 1 A - Z - 2 بواسطة C C - 3 B - Z - K

ولكن ستشمل العلاقات غير صالحة A - K (مجموعة العمل دون الموقع) Y - K - 1 (لا شركة)

وهكذا، لخلق مائدتي، لقد خلق

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

وأنا أحسب هذا من شأنه أن التعامل مع جميع علاقاتي إلى جانب neccessity في مهمة لديك موقع إذا كان هناك مجموعة العمل (الذي يمكنني القيام به بسعادة برمجيا أو مع المشغلات، على ما أظن)

ولكن، عندما كنت اختبار هذا المخطط، لأنها تتيح لي أن أدخل ما يلي ...

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

... دون شكوى. انا التخمين أن (1، باطل، باطل، باطل) لا يساوي نفسه، ليتم تضمينها بالقيم الخالية. إذا كان هذا هو الحال، هل هناك أي طريقة أستطيع التعامل مع هذه العلاقة؟

وسيكون موضع تقدير أي مساعدة!

هل كانت مفيدة؟

المحلول

وهذه هي ميزة (وإن لم يكن ما كنت أتوقع، إما).

يشير هذا موضوع جعل المفتاح الخاص بك مفتاح أساسي للحصول على السلوك الذي من المتوقع:

<اقتباس فقرة>   

وهذه هي ميزة - قيمة NULL هي   قيمة غير محددة، لذلك اثنين NULL   القيم ليست هي نفسها. يمكن أن يكون   مربكا بعض الشيء ولكن من المنطقي عندما   كنت تفكر في ذلك.

     

وفهرس فريد لا ضمان   قيم غير فارغة هي فريدة من نوعها. يمكنك   تحديد ذلك العمود الخاص بك لا يقبل   قيم فارغة.

نصائح أخرى

والطريقة الوحيدة التي يمكنني أن أفكر في التعامل مع هذا دون محفزات إضافية / برمجة سيكون لديك "لا شيء مما سبق" واحد القيمة في كل من الجداول المشار إليه، بحيث الاختبار الخاصة بك ستبدو

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

وأين معرفات NO_* هي النوع الصحيح / طول للأعمدة الهوية الخاصة بك. وهذا من شأنه ثم تفشل، كما كنت تتوقع ذلك.

في الخلية NULL! = NULL، أو أي شيء. لذلك هذا هو ما لا يعمل UNIQUE. يجب عليك استخدام قيمة افتراضية أخرى للفراغات، مثل الصفر

وأعتقد أنه من المهم أن نلاحظ أن هناك وسيلة مناسبة للقيم NULL إلى أن تفسر والتعامل معها، والسلوك التي أظهرتها OP هو بالضبط ما المقصود. يمكنك تجاهل هذا السلوك، ويمكنك التعامل مع الاستعلام الخاص بك في أي بالطريقة التي تريدها دون اعتراض من لي، ولكن قد يكون جيدا ل"قبول" جوابا التي تصف نوعا من أفضل الممارسات، بدلا من تفضيل شخصي غير قياسي.

وأو إذا كنت لا أتفق مع الإجماع أفضل الممارسات، يمكنك فقط لا تحمل أي إجابة.

وانها ليست سباق للحصول على إجابة مقبولة في أسرع وقت ممكن. والمقصود من المداولات والتعاون أيضا أن تكون جزءا من هذه العملية، على ما أعتقد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top