2011-02-04 13 views
5

मेरे पास एक टेबल है, foo, जिसे 'create_at' द्वारा विभाजित किया गया है और इसकी प्राथमिक कुंजी (id, created_at) है। यानी .:मैं विभाजित MySQL डीबी में किसी फ़ील्ड पर एक अद्वितीय अनुक्रमणिका कैसे जोड़ूं?

CREATE TABLE `foo` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `bar_id` int(11) DEFAULT NULL, 
    ... 

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 
/*!50100 PARTITION BY RANGE (TO_DAYS(created_at)) 
(PARTITION p0 VALUES LESS THAN (733712) ENGINE = InnoDB, 
PARTITION p1 VALUES LESS THAN (733773) ENGINE = InnoDB, 
PARTITION p2 VALUES LESS THAN (733832) ENGINE = InnoDB, 
PARTITION p3 VALUES LESS THAN (733893) ENGINE = InnoDB, 
... 
) 

मैं एक अद्वितीय सूचकांक कैसे बना सकता हूँ ऐसी है कि bar_id सभी विभाजनों भर में अनूठा है? अगर मैं कुछ इस तरह का प्रयास करें:

CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id); 

मैं त्रुटि प्राप्त:

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function 

लेकिन, अगर मैं विभाजन समारोह (id, created_at) शामिल हैं मैं एक सूचकांक के साथ अंत जब तत्कालीन सूचकांक के निर्माण कि गारंटी नहीं देता है कि bar_id अद्वितीय है।

अद्यतन

मैंने कहा जाना चाहिए था मैं पहले से ही मेज पर एक प्राथमिक कुंजी है:

PRIMARY KEY (`id`,`created_at`) 

इसके अलावा, bar_id शून्य हो सकता है।

+2

अरे, क्या आप एक रास्ता समझ गए? मैं एक ही मुद्दे के साथ संघर्ष कर रहा हूं। मुझे यह भी समझ में नहीं आता कि विभाजन कुंजी को अद्वितीय कुंजी का हिस्सा क्यों होना चाहिए। इससे समझ में नहीं आता है। – varunl

+0

@ वरुणल, मेरे पास भी एक ही समस्या है। मुझे विभाजन कुंजी के रूप में 'प्रारंभ डेटाटाइम' फ़ील्ड का उपयोग करने की आवश्यकता है और मैं इसे प्राथमिक कुंजी के रूप में दायर 'आईडी' के साथ बना देता हूं, लेकिन मुझे अन्य फ़ील्ड को अनन्य कुंजी के रूप में जाना है जो वास्तव में अद्वितीय होने की आवश्यकता है। – shgnInc

उत्तर

0

प्राथमिक कुंजी बनाएं।

विभाजन पर MySQL docs से: विभाजन अभिव्यक्ति के लिए उपयोग किया जाने वाला कोई भी स्तंभ तालिका की प्राथमिक कुंजी (यदि उसके पास है) का हिस्सा होना चाहिए (या पहले) अनन्य कुंजी (यदि इसमें अनन्य कुंजी है लेकिन कोई प्राथमिक कुंजी नहीं है)। अन्यथा, आपको त्रुटि संदेश दिखाई देगा, "एक प्राथमिक कुंजी को विभाजन फ़ंक्शन में सभी फ़ील्ड शामिल करने की आवश्यकता है"।

यदि किसी तालिका में कोई प्राथमिक कुंजी नहीं है, लेकिन इसमें एक या अधिक अनन्य कुंजी हैं, तो विभाजन अभिव्यक्ति में उपयोग किए गए किसी भी कॉलम (पहली) अद्वितीय कुंजी का हिस्सा होना चाहिए।

+0

मुझे यह उल्लेख करना चाहिए था कि मेरे पास पहले से ही तालिका पर प्राथमिक कुंजी है: प्राथमिक कुंजी ('id',' created_at')। इसके अलावा, bar_id पूर्ण हो सकता है। –

0

यह अद्वितीय bar_id, और पहले से सम्मिलित ट्रिगर को स्टोर करने के लिए द्वितीयक तालिका के माध्यम से किया जा सकता है।

+0

यह एक दिलचस्प दृष्टिकोण है। दुर्भाग्यवश, इसका मतलब है कि मुझे उन मामलों को संभालने के लिए एक नियमित (या अधिक) लिखना होगा जहां bar_id को NULL में अपडेट किया गया है या foo में दी गई पंक्ति के लिए बदला गया है, सही? बहुत सारे उपर की तरह लगता है, जो मुझे विश्वास दिलाता है कि एक आसान समाधान होना चाहिए। –

2

त्रुटि संदेश स्वयं समस्या को समझाता है। कृपया, मैनुअल पढ़ने, http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html

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

+2

ऐसा लगता है कि चिपका हुआ यूआरएल छोटा कर दिया गया है। – Dughall

+0

नोट के लिए धन्यवाद, मुझे लगता है कि उन्होंने इसे यहां ले जाया है http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys।एचटीएमएल मैंने अपने उत्तर में लिंक अपडेट किया है। – azzaxp

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