है कि अगर एक अच्छा डिजाइन अभ्यास है यह पता नहीं है, लेकिन यकीन है कि के लिए यह एक तालिका की एक समग्र विदेशी कुंजी होना संभव है जो अन्य तालिका की समग्र प्राथमिक कुंजी का हिस्सा है।
कहते हैं कि हम एक मेज एक समग्र प्राथमिक कुंजी (ए, बी)
अब हम एक मेज हो सकता होने 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);
ऊपर उल्लेख मामले डेटाबेस में स्तंभ एक व्यक्तिगत रूप से अद्वितीय होने की अपेक्षा करेंगे और इससे कोई फर्क नहीं पड़ता अगर का संयोजन (ए, बी) अद्वितीय है उसी स्तंभ बी के लिए इस प्रकार है।
आपने समग्र प्राथमिक कुंजी को कैसे परिभाषित किया है? क्या आपने _each_ कॉलम पर एक अनन्य बाधा डाली है? – Oded
लेकिन मैं नहीं चाहता कि प्रत्येक कॉलम अद्वितीय हो। मैं दो या तीन स्तंभों का संयोजन अद्वितीय होना चाहता हूं। – Tony
मैंने पूछा कि आपने बाधाओं को कैसे परिभाषित किया है। मैंने नहीं कहा कि आपको उन्हें इस तरह परिभाषित करना चाहिए। – Oded