2012-10-01 21 views
6

क्या तालिका की विदेशी कुंजी किसी अन्य तालिका की समग्र प्राथमिक कुंजी का हिस्सा हो सकती है?एसक्यूएल टेबल विदेशी कुंजी जो एक समग्र प्राथमिक कुंजी का हिस्सा है

परियोजना तालिका::

Composite Primary Keys: UserId, ProjectId (न तो अद्वितीय हैं उदाहरण के लिए, अगर मैं दो तालिकाओं है, एक जानकारी विभिन्न उपयोगकर्ताओं की सभी सक्रिय परियोजनाओं और क्या उपकरण परियोजनाओं के द्वारा प्रयोग किया जा रहा है पर एक और युक्त सूचना के आधार पर होता है खुद से)

उपकरण तालिका:

Composite Primary Keys: UserId, ProjectId, EquipmentId (न खुद से अद्वितीय)

अब है यह पो प्रोजेक्ट टेबल से प्रोजेक्ट आईडी में प्रोजेक्ट टेबल से एक विदेशी कुंजी होने के लिए सेट करने योग्य है? जब मैं कोशिश करता हूं, तो मुझे यह कहते हुए एक त्रुटि मिलती है कि प्रोजेक्ट टेबल में कॉलम मौजूदा प्राथमिक कुंजी या अद्वितीय बाधा से मेल नहीं खाता है?

+0

आपने समग्र प्राथमिक कुंजी को कैसे परिभाषित किया है? क्या आपने _each_ कॉलम पर एक अनन्य बाधा डाली है? – Oded

+0

लेकिन मैं नहीं चाहता कि प्रत्येक कॉलम अद्वितीय हो। मैं दो या तीन स्तंभों का संयोजन अद्वितीय होना चाहता हूं। – Tony

+0

मैंने पूछा कि आपने बाधाओं को कैसे परिभाषित किया है। मैंने नहीं कहा कि आपको उन्हें इस तरह परिभाषित करना चाहिए। – Oded

उत्तर

8

सं

जब आप एक विदेशी कुंजी बनाने, महत्वपूर्ण यह है कि आप "बात करने के लिए" अन्य तालिका में एक अद्वितीय या प्राथमिक KEY प्रतिबंध होना चाहिए। आप एक विदेशी कुंजी स्थापित नहीं कर सकते जो कि कॉलम को इंगित करता है जो डुप्लिकेट मानों को अनुमति देता है। यह कल्पना करना बहुत कठिन होगा कि डेटा को "कार्य" कैसे करना चाहिए यदि आप अन्य तालिका में डुप्लिकेट मानों में से एक को अपडेट करते हैं (उदाहरण के लिए)।

जो भी आप चाहते हैं उसे करने के लिए आपको एक प्रोजेक्ट टेबल स्थापित करना होगा जिसमें प्रोजेक्ट आईडी अद्वितीय या प्राथमिक कुंजी है और फिर में दोनों तालिकाओं में विदेशी कुंजी को इंगित करें।

मूल रूप से, आप प्राथमिक कुंजी बनाने वाली प्रत्येक तालिका में कॉलम का वर्णन करने के लिए "प्राथमिक कुंजी" शब्द का उपयोग करते हैं। वास्तव में, प्रत्येक तालिका में एक और केवल एक प्राथमिक कुंजी हो सकती है। वह कुंजी एक या अधिक कॉलम से बना हो सकती है, लेकिन कुंजी को अभी भी एकवचन के लिए संदर्भित किया जाता है। खोजों को अनुकूलित करने के लिए प्राथमिक कुंजी का उपयोग करते समय यह एक महत्वपूर्ण अंतर है।

-1

@ लैरी लुस्टिग विदेशी कुंजी अन्य तालिका में प्राथमिक कुंजी का हिस्सा हो सकती है।

स्रोत: तालिकाओं के बीच Dependent relationship

चेक संबंध: Zdarzenie (घटना) और TypZdarzenia (घटना के प्रकार)

football Competition - database

0

है कि अगर एक अच्छा डिजाइन अभ्यास है यह पता नहीं है, लेकिन यकीन है कि के लिए यह एक तालिका की एक समग्र विदेशी कुंजी होना संभव है जो अन्य तालिका की समग्र प्राथमिक कुंजी का हिस्सा है।

कहते हैं कि हम एक मेज एक समग्र प्राथमिक कुंजी (ए, बी)

अब हम एक मेज हो सकता होने Test2 कहना test1 है प्राथमिक कुंजी (पी, क्यू, आर) जहां (पी, क्यू) के में test2 के test2 संदर्भ (ए, बी)।

मैंने MySQL डेटाबेस में निम्न स्क्रिप्ट चलाई और यह ठीक काम करता है।

CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 


CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

ऊपर उल्लेख किया है मामले में, डेटाबेस के संयोजन की उम्मीद है (ए, बी) अद्वितीय होना और यह है test1 तालिका में प्राथमिक कुंजी जा रहा है।


लेकिन अगर आप निम्नलिखित की तरह कुछ करने के लिए प्रयास करते हैं, स्क्रिप्ट विफल हो जाएगा। डेटाबेस आपको test2 तालिका बनाने नहीं देगा।

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

ऊपर उल्लेख मामले डेटाबेस में स्तंभ एक व्यक्तिगत रूप से अद्वितीय होने की अपेक्षा करेंगे और इससे कोई फर्क नहीं पड़ता अगर का संयोजन (ए, बी) अद्वितीय है उसी स्तंभ बी के लिए इस प्रकार है।

संबंधित मुद्दे