2012-02-19 27 views
5

पर बनाया गया है मुझे MySQL मिश्रित अद्वितीय कुंजी के साथ समस्याएं आ रही हैं।MySQL छेड़छाड़ अद्वितीय वर्णों को 64 वर्णों

इसमें यूआरएल, पूर्णांक मूल्य और दिनांक फ़ील्ड शामिल है।

लेकिन जब मैं पंक्ति सम्मिलित करने का प्रयास करें, मैं एक अपवाद प्राप्त करें:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'http://cars.auto.ru/cars/used/sale/16152870-c13f1.html-2012-02-1' for key 'one_a_day_idx' 

आप देख सकते हैं, बना सूचकांक 64 वर्णों से छोटा कर दिया गया है, और इस वजह से यह एक अद्वितीय किसी भी अधिक (मैं नहीं है ', बाहरी स्रोत दिन में एक बार)

लेकिन सबसे भ्रामक है कि रिकॉर्ड डाला गया था से डेटा प्राप्त करने हूँ हालांकि बाधा उल्लंघन के बारे में एक अपवाद

फेंक दिया गया था वहाँ एक समान प्रश्न 0 था, लेकिन सूचकांक की वास्तविक लंबाई जानने के लिए एकमात्र सलाह दिखाने के लिए तालिका बनाएं।

| auto_ru_sale | CREATE TABLE `auto_ru_sale` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `template` int(11) NOT NULL, 
    `region` varchar(128) NOT NULL, 
    `URI` varchar(128) NOT NULL, 
    `subType` varchar(128) NOT NULL, 
    `cost` int(11) NOT NULL, 
    `productionYear` int(11) NOT NULL, 
    `engineVolume` int(11) NOT NULL, 
    `transmitionType` varchar(1) NOT NULL, 
    `run` int(11) NOT NULL, 
    `evaluationDate` date NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `one_a_day_idx` (`template`,`URI`,`evaluationDate`), 
    KEY `prodyear_idx` (`productionYear`), 
    KEY `evdate_idx` (`evaluationDate`), 
    CONSTRAINT `auto_ru_sale_ibfk_1` FOREIGN KEY (`template`) REFERENCES `auto_ru_ 
datatemplate` (`ID`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=127012 DEFAULT CHARSET=utf8 | 

तो, मैं सूचकांक लंबाई के लिए कोई सीमाएं नहीं देखते हैं:

शो टेबल बना यह पता चलता है।

हर किसी के लिए बहुत धन्यवाद, जो इस मुद्दे के बारे में कुछ मदद दे सकते हैं।

+0

क्या आपने कभी अपनी समस्या का समाधान निकाला है? हमारे पास एक वर्चर (255) फ़ील्ड पर एक अद्वितीय इंडेक्स के साथ एक समान समस्या है। स्पष्ट रूप से जेडीबीसी/जेपीए एक MySQLIntegrityConstraintViolationException फेंकता है जिसमें स्ट्रिंग मान के पहले 64 वर्ण शामिल हैं जिन्हें हम सम्मिलित करने का प्रयास कर रहे हैं। हालांकि, MySQL वर्कबेंच के माध्यम से सीधे वही मान डालने से समस्या के बिना ठीक काम करता है। इससे मुझे विश्वास होता है कि यह जेपीए या जेडीबीसी चालक से संबंधित हो सकता है। – tvirtualw

+0

हमें हमारी समस्या का समाधान मिला। डिफ़ॉल्ट रूप से MySQL संयोजन केस असंवेदनशील है। हमारे टेबल में डालने के लिए हमने जो मूल्य डालने की कोशिश की थी, वही अक्षर थे और कभी-कभी वे सिर्फ एक अक्षर को अपरकेस, अन्य लोअरकेस के रूप में भिन्न होते थे। 'एबीसीडी' बनाम 'एबीसीडी' की तरह। डिफ़ॉल्ट संयोजन के साथ यह एक अद्वितीय इंडेक्स उल्लंघन का कारण बन जाएगा (मुझे प्राथमिक कुंजी के लिए भी लगता है)। हमने इसे utf8_bin में बदल दिया और फिर यह हमारे लिए काम किया। – tvirtualw

उत्तर

1

मुझे आपके सटीक प्रश्न का उत्तर नहीं है, हालांकि एक सुझाव जो डेटाबेस समय में सुधार करते समय इसे ठीक करना चाहिए।

एक मेज यानी यूआरआई बनाएँ (URI_id INT अहस्ताक्षरित पी ऐ, यूआरआई VARCHAR (128) नहीं NULL, अद्वितीय कुंजी (URI)) और auto_ru_sale बदलने यूआरआई

के बजाय uri_id स्टोर करने के लिए इसका मतलब यह होगा कि कुंजी एक हो जाता है INT, INT, DATE की कुंजी जो अधिक कुशल होगी। कम डुप्लिकेट के कारण आपकी तालिका का आकार कम हो जाएगा। सभी सामान्यीकरण में सभी फायदेमंद हैं।

मैं इसे "क्षेत्र" फ़ील्ड पर भी लागू करने की सलाह दूंगा क्योंकि मुझे लगता है कि इसमें बहुत अधिक डुप्लिकेट डेटा भी है।

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