2010-09-15 12 views
6

मेरे पास AUTO_INCREMENT प्राथमिक कुंजी वाला एक टेबल है। यदि तालिका में अंतिम पंक्ति हटा दी जाती है, तो अगली-सम्मिलित पंक्ति एक ही आईडी लेगी।MySQL रीयलिंग ऑटोऑक्रिकमेंट आईडी

क्या MySQL को टी-एसक्यूएल की तरह व्यवहार करने का तरीका है, और आईडी का पुन: उपयोग नहीं किया गया है? फिर यदि हटाई गई पंक्ति को डेटाबेस से बाहरी किसी चीज़ से गलती से संदर्भित किया जाता है, तो त्रुटि को हाइलाइट करते हुए कोई पंक्तियां वापस नहीं की जाएंगी।

उत्तर

2

के अलावा अन्य इस मामले में है, तो आप शायद सार्वजनिक रूप से सुलभ स्थानों में AUTO_INCREMENT सूचकांकों का उपयोग नहीं किया जाना चाहिए।

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

इस तरह, आप किसी भी प्रकार की कुंजी का उपयोग कर सकते हैं, यहां तक ​​कि गैर-संख्यात्मक, और अपने स्वयं के एल्गोरिदम का उपयोग करके उन्हें बढ़ा सकते हैं।

मैंने पहले भी 6-चरित्र अल्फा-न्यूमेरिक कुंजी का इस्तेमाल किया है:

CREATE TABLE `TableKeys` (
    `table_name` VARCHAR(8) NOT NULL, 
    `last_key` VARCHAR(6) NOT NULL, 
    PRIMARY KEY (`table_name`) 
); 

SELECT * FROM `TableKeys`; 

table_name | last_key 
-----------+--------- 
users  | U00003A2 
articles | A000166D 
products | P000009G 
+0

हर दूसरे संबंध में, AutO_INCREMENT मेरे उद्देश्यों को ठीक से सेवा देता है, और सम्मिलित प्रश्नों को सरल रखता है। मुझे लगता है कि मैं हटाए जाने पर पहचान को मजबूर करने के लिए "वैकल्पिक तालिका x ऑटोऑक्रिकेशन = वाई" निर्माण का उपयोग करूंगा। – Paul

1

यह नहीं है कि हमारे MySQL डेटाबेस काम करते हैं, जब एक रिकॉर्ड हटा दिया जाता है तो अगला डाला गया अगला नंबर होता है, जिसे हटाया नहीं गया था।

+0

मैं इसे रीसेट करता है जब आप डाटाबेस को पुनः आरंभ में सोचते हैं। –

+3

जब आप डेटाबेस को पुनरारंभ करते हैं तो InnoDB रीसेट करता है। जब InnoDB शुरू होता है, तो यह उच्चतम वृद्धि पाता है और फिर वहां से शुरू होता है। माईसाम वृद्धि आईडी को कैश करता है, इसलिए ऐसा नहीं होता है। –

+0

MySQL में मैं (5.7.x) का उपयोग कर रहा हूं, एक बार जब उच्चतम कुंजी वाला रिकॉर्ड हटा दिया जाता है, तो अगला नया रिकॉर्ड> तुरंत <उस कुंजी मान का पुन: उपयोग करता है। कोई डीबी पुनरारंभ की जरूरत नहीं है। – Riva

1

जैसा कि मैं इसे समझता हूं, ऐसा करने का कोई तरीका नहीं है। आप हटाए गए ध्वज को जोड़कर इसके आसपास काम करने पर विचार कर सकते हैं, और फिर पंक्ति को हटाने के बजाय हटाए गए ध्वज को सेट कर सकते हैं।

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

+2

क्षमा करें, मैं बस अपना प्रश्न दोबारा पढ़ता हूं और देखता हूं कि आप हटाए गए पंक्ति का संदर्भ देने वाले अन्य डीबी तत्वों के बारे में चिंतित नहीं हैं, बल्कि "डीबी के बाहर बाहरी" संदर्भित हैं। इससे कुछ ऐसा संकेत मिलेगा जैसे उपयोगकर्ता उपयोगकर्ता को एक लिंक बुक करता है जिसमें यूआरएल में आईडी शामिल होती है, फिर जब वे कोई परिणाम न मिलने के बजाय उस बुकमार्क का पुन: उपयोग करते हैं, तो उन्हें गलत परिणाम मिलते हैं। इस मामले में, मैं कहूंगा कि हटाए गए ध्वज शायद जाने का सबसे अच्छा तरीका है, और उस डेटा को एक्सेस किए जाने पर उपयुक्त "हटाए गए" उपयोगकर्ता संदेश को प्रदर्शित करने के लिए अपनी प्रस्तुति तर्क को बदलें। –

+1

हटाए गए ध्वज के साथ समस्या यह है कि आपको डेटा को एक्सेस करने वाली प्रत्येक क्वेरी में बाधा के रूप में इसका उपयोग करना याद रखना होगा (और मेरे मामले में बहुत सारे हैं), और फिर किसी भी इंडेक्सिंग प्रभाव पर विचार करें – Paul

0

Mysql मैनुअल says:

इस मामले में (जब AUTO_INCREMENT स्तंभ एक बहु-स्तंभ अनुक्रमणिका का हिस्सा है), AUTO_INCREMENT मूल्यों अगर आप किसी भी समूह में सबसे बड़ी AUTO_INCREMENT मूल्य के साथ पंक्ति को हटा पुन: उपयोग किया जाता है। यह MyISAM तालिकाओं के लिए भी होता है, जिसके लिए स्वचालित रूप से AUTO_INCREMENT मानों का पुन: उपयोग नहीं किया जाता है।

ऐसा लगता है वहाँ इंजन के लिए इस तरह के एक व्यवहार संभव हो, MyISAM

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