2011-03-07 8 views
5

मैं एक MySQL तालिका मिल गया है के कारण है कि भंडार यूआरएल के रूप में अनूठी कुंजियाँ। मैं अपनी चाबियों पर टकराव शुरू कर रहा हूं क्योंकि ऐसा लगता है कि कुंजियां स्वयं केवल पहले 64 बाइट्स (या यदि आप चाहें तो पात्र हैं, यह लैटिन -1 कोलाइट किया गया है) किसी यूआरएल के हैं। तो यदि एक यूआरएल 64 वर्णों से अधिक है और मुझे पहले से ही एक समान यूआरएल मिल गया है तो यह एक त्रुटि फेंकता है।MyISAM अनूठी कुंजियाँ 64 बाइट्स में काटा जा रहा है, टकराव

उदाहरण के लिए:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 
'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elec' for key 'url' 

Isnt MyISAM 1000-बाइट कुंजी लंबाई है माना जाता:

SELECT l.link_id FROM mydb.links l WHERE 
url = 'http://etonline.com/tv/108475_Charlie_Sheen_The_People_Have_Elected_Me_as_Their_Leader/index.html' 

इस त्रुटि फेंकता?

संपादित करें:

ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) ; 
:

CREATE TABLE `links` (
    `link_id` int(11) NOT NULL AUTO_INCREMENT, 
    `url` varchar(500) NOT NULL, 
    PRIMARY KEY (`link_id`), 
    UNIQUE KEY `url` (`url`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

मैं 256 इस तरह एक को सेट करने की कोशिश की: वहाँ CREATE TABLE स्थिति पर सूचीबद्ध एक उपसर्ग लंबाई फोन यह इस तरह दिखता है होना करने के लिए प्रतीत नहीं होता

और मैं निम्नलिखित त्रुटि मिली:

ERROR 1062: Duplicate entry '<...64-byte key...>' for key 'url' 
SQL Statement: 
ALTER TABLE `mydb`.`links` 
DROP INDEX `url`, ADD UNIQUE INDEX `url` (`url`(256) ASC) 

ERROR: Error when running failback script. Details follow. 

ERROR 1050: Table 'links' already exists 

मुझे लगता है कि वापस आने सिर्फ इसलिए कि मैं ALTE भाग गया है MySQL वर्कबेंच के माध्यम से आर टेबल।

+0

अपनी लिंक तालिका पर 'शो बनाएं तालिका' करें। सूचकांक शायद 64 की लंबाई के साथ परिभाषित किया गया है। –

उत्तर

2

जब आप एक सूचकांक कि केवल एक उपसर्ग (सूचकांक की लंबाई निर्दिष्ट करने के द्वारा) का उपयोग करता है बनाने के लिए, तो उपसर्ग 1000 बाइट्स (7.5.1 Column Indexes देखें) तक हो सकती है। इंडेक्स की वास्तविक लंबाई जानने के लिए SHOW CREATE TABLE का उपयोग करें।

+0

@ ओस्वाल्ड ने जो कहा उससे सहमत हैं। आधिकारिक दस्तावेज कहते हैं ([कड़ी] (http://dev.mysql.com/doc/refman/5.1/en/create-index.html)): 'इंडेक्स बनाया जा सकता है कि स्तंभ मानों की केवल प्रमुख भाग का उपयोग, COL_NAME (लम्बाई) सिंटैक्स का उपयोग एक <सूचकांक उपसर्ग लंबाई> निर्दिष्ट करने के लिए ... 'मैं एक ही समस्या का सामना करना पड़ा है, लेकिन मैं कोई आधिकारिक दस्तावेज़ जिसे कहते हैं कि यह 64 सूचकांक उपसर्ग लंबाई दोषी है नहीं मिल सकता है जब chars- का आकार कॉलम की तरह gt 64 है और आपने इंडेक्स उपसर्ग लंबाई निर्दिष्ट नहीं की है। – lyfing

8

मुझे लगता है कि त्रुटि संदेश केवल आप पहली बार 64 वर्ण दिख रहा है, लेकिन इसका मतलब यह नहीं है कि बाधा 64 वर्णों तक सीमित है।

यदि आपका SHOW CREATE TABLE उत्पादन सही है, तो सूचकांक सभी 500 अक्षरों पर है, और आप एक सटीक डुप्लिकेट मार रहे हैं।

+1

मैं भी 64 वर्णों में छोटा कर दिया इस त्रुटि को देखा है जब यह प्राथमिक कुंजी की लंबाई के साथ कोई संबंध नहीं था। (MySQL Ver 14.14 Distrib 5.1.61) – Flimm

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