2011-11-13 14 views
20

यहाँ MySQL 5.3.x + DB में एक टेबल है:MySQL: # 1075 - गलत तालिका परिभाषा; autoincrement बनाम एक और कुंजी?

CREATE TABLE members` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL , 
    UNIQUE (memberid), 
    PRIMARY KEY (id) 
) ENGINE = MYISAM; 

ईद स्तंभ प्रश्नों में इस्तेमाल कभी नहीं किया है, यह सिर्फ दृश्य सुविधा के लिए है (इसलिए यह कैसे तालिका में वृद्धि देखना आसान है)। Memberid, एक वास्तविक कुंजी है अद्वितीय है, और memberid किसी भी सदस्य (जहां memberid = 'abcde') की पहचान करने के प्रश्नों में प्रयोग किया जाता है।

मेरा प्रश्न है: कैसे auto_increment रखने के लिए, लेकिन memberid एक प्राथमिक कुंजी के रूप बनाने के लिए? क्या यह संभव है? जब मैं प्राथमिक कुंजी (memberid) के साथ इस तालिका बनाने के लिए प्रयास करते हैं, मैं एक त्रुटि मिलती है:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

सबसे अच्छा विकल्प क्या है (उम्मीद है, वहाँ आईडी स्तंभ रखें ताकि प्रदर्शन अच्छा है और एक तरीका है पूछताछ किसी भी उपयोगकर्ता को सदस्य द्वारा पहचानें, आईडी द्वारा नहीं), यदि प्रदर्शन बहुत महत्वपूर्ण है (हालांकि डिस्क स्थान नहीं है)?

उत्तर

41

आप , एक स्वत: Incrementing स्तंभ PRIMARY KEY नहीं है हो सकता है जब तक एक सूचकांक (key) उस पर है के रूप में:

CREATE TABLE members ( 
    id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    memberid VARCHAR(30) NOT NULL , 
    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    firstname VARCHAR(50) NULL , 
    lastname VARCHAR(50) NULL , 
    PRIMARY KEY (memberid) , 
    KEY (id)       --- or: UNIQUE KEY (id) 
) ENGINE = MYISAM; 
+0

+1 और टिप्पणी के लिए धन्यवाद, आज कुछ सीखा :) –

4

आप आईडी प्राथमिक कुंजी, और सेट NOT NULL UNIQUE को member_id बना सकते हैं। (जो आपने किया है।) NOT NULL UNIQUE कॉलम विदेशी कुंजी संदर्भों की तरह विदेशी कुंजी संदर्भों का लक्ष्य हो सकते हैं। (मुझे पूरा यकीन है कि सभी एसक्यूएल प्लेटफार्मों के बारे में सच है।)

वैचारिक स्तर पर, PRIMARY KEY और NOT NULL UNIQUE के बीच कोई अंतर नहीं है। भौतिक स्तर पर, यह एक MySQL मुद्दा है; अन्य एसक्यूएल प्लेटफॉर्म आपको प्राथमिक कुंजी बनाने के बिना अनुक्रम का उपयोग करने देंगे।

लेकिन यदि प्रदर्शन वास्तव में महत्वपूर्ण है, तो आपको उस छोटी दृश्य सुविधा के लिए अपनी तालिका को चार बाइट प्रति पंक्ति से चौड़ा करने के बारे में दो बार सोचना चाहिए। इसके अतिरिक्त, यदि आप विदेशी कुंजी बाधाओं को लागू करने के लिए INNODB पर स्विच करते हैं, तो MySQL क्लस्टर इंडेक्स में आपकी प्राथमिक कुंजी का उपयोग करेगा। चूंकि आप अपनी प्राथमिक कुंजी का उपयोग नहीं कर रहे हैं, इसलिए मुझे लगता है कि प्रदर्शन को नुकसान पहुंचा सकता है।

0

ऊपर समस्या के लिए, सबसे पहले अगर मान लीजिए तालिकाओं में 1 से अधिक प्राथमिक कुंजी होती है तो पहले उन सभी प्राथमिक कुंजी को हटा दें और प्राथमिक कुंजी के रूप में पहले ऑटो इन्हेंमेंट फ़ील्ड जोड़ें, फिर पहले हटाए गए एक और आवश्यक प्राथमिक कुंजी जोड़ें। विकल्प क्षेत्र से आवश्यक फ़ील्ड के लिए ऑटो इंक्रेमेंट विकल्प सेट करें।

0

मुझे लगता है कि मैं समझता हूं कि आपकी त्रुटि का कारण क्या है। सबसे पहले आप ऑटो ऑटो इंक्रेमेंट फ़ील्ड पर क्लिक करते हैं, फिर इसे प्राथमिक कुंजी के रूप में चुनें।

The Right way is First You have to select it as a primary key then you have to click auto AUTO INCREMENT field.

बहुत आसान। धन्यवाद

4

पहले auto_increment बिना तालिका बनाने,

CREATE TABLE `members`(
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL 
    PRIMARY KEY (memberid) 
) ENGINE = MYISAM; 

सूचकांक के रूप में सेट id के बाद,

ALTER TABLE `members` ADD INDEX(`id`); 

auto_increment के रूप में सेट id के बाद,

ALTER TABLE `members` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT; 

या

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL, 
     PRIMARY KEY (`memberid`), 
     KEY `id` (`id`) 
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;