2012-01-28 12 views
11

मैं एक प्रश्न है कि निम्न तालिका पर आईडी अगले मान प्रदान करेंगे चलाने उत्पन्न करने में सक्षम होने की जरूरत है:Oracle की SEQUENCE.NEXTVAL की MySQL बराबर

CREATE TABLE animals (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
) 

ओरेकल में आप एक दृश्य पर NEXTVAL फोन और कर सकते हैं यह आपको अगली अनुक्रम देता है (नोट: टेबल पर डालने के बिना)।

आसपास googling के बाद मैंने पाया कि आप निम्न क्वेरी का उपयोग करके auto_increment के वर्तमान मूल्य प्राप्त कर सकते हैं:

SELECT Auto_increment 
FROM information_schema.tables 
WHERE table_name='animals'; 

समस्या मैं मूल्य चाहते हैं हर बार मूल्य क्वेरी की जाती है को बढ़ा देते जा रहा है। ओरेकल में, जब आप अगली बार कॉल करते हैं, तो अनुक्रम का मान बढ़ जाता है भले ही आप किसी तालिका में कोई पंक्ति न डालें।

क्या कोई तरीका है कि मैं उपर्युक्त क्वेरी को संशोधित कर सकता हूं ताकि वापस लौटाए गए मूल्य हमेशा पूछे जाने वाले प्रश्न से अलग होंगे? यानी ऑटो_इनक्रिकमेंट हर बार चेक किए जाने पर बढ़ाया जाता है और जब किसी क्वेरी पर उपयोग किया जाता है तो यह एक नए मान का उपयोग करेगा।

मैं वसंत जेडीबीसीटीप्लेट का उपयोग कर रहा हूं ताकि यदि इसे एक प्रश्न में बेहतर किया जा सके।

उत्तर

5

InnoDB के साथ इस उदाहरण अपने स्वयं के काउंटर को लागू करने के लिए एक तरह से इंटरलॉक प्रश्नों का उपयोग कर प्रदर्शित करता है:

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

क्या आप के लिए एक अंतर बनाने की जरूरत है? आईडी आरक्षित करने के लिए? मैं सभी लागतों पर डिज़ाइन को "ठीक" करना चाहता हूं और अनुक्रम को छूने के बजाय अन्य मॉड्यूल अपडेट करना चाहता हूं।

अनुक्रम को स्पष्ट रूप से बढ़ाने के बजाय, मैं आईडी को आवंटित करने और वापस करने के लिए प्रत्येक आईडी के लिए एक डिफ़ॉल्ट पंक्ति (अमान्य चिह्नित) डालने का अर्थ दूंगा। यह दृष्टिकोण सुसंगत और पोर्टेबल है। बाद में, एक स्पष्ट अनुक्रम मान का उपयोग करके आवेषण को मजबूर करने के बजाय, आप इन डिफ़ॉल्ट पंक्तियों को उनके मिलान अनुक्रम मानों से अपडेट कर सकते हैं। इसके लिए अधिक मेमोरी की आवश्यकता है लेकिन कोई ताले नहीं है। कालबाह्य पंक्तियों पर कचरा संग्रह यहां मदद कर सकता है। 'डालें या अपडेट करें' कथन संग्रहित पंक्तियों को कचरा बना सकता है, हालांकि मैं ऐसा नहीं करता।

+0

हर कीमत पर? वास्तव में? –

4

आप अपनी खुद की MySQL समारोह जोड़ सकता है - के रूप में http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/ पर प्रदर्शन किया - आप कुछ इस तरह करने की अनुमति:

SELECT nextval('sq_my_sequence') as next_sequence; 
+0

कुछ करने के लिए सक्षम होना चाहिए उत्पन्न कर सकते हैं। दुर्भाग्य से इसे आईडी कॉलम पर AUTO_INCREMENT के उपयोग को हटाने की आवश्यकता है जो इस समय संभव नहीं है क्योंकि मुझे इस तालिका का उपयोग करने वाले अन्य मॉड्यूल को बदलने की आवश्यकता होगी - धन्यवाद। – ziggy

+1

उस पृष्ठ पर टिप्पणियों में कोई व्यक्ति इस चिंता को उठाता है कि दौड़ की स्थिति हो सकती है। Auto_increment विधि @Ivan ने इसका उपयोग करना आसान लगता है, जहां एक ही कथन में काम किया जाता है, और इसलिए परमाणु है। आप इवान की विधि को एक समारोह में लपेट सकते हैं, जो आपको अच्छा लगेगा, जिससे आप दोनों दृष्टिकोणों का सर्वश्रेष्ठ प्रदर्शन कर सकते हैं। –

+0

क्या आप लिंक के बजाय वास्तविक सामग्री के लिए अपना उत्तर अपडेट कर सकते हैं? जो प्रश्न आप अकेले प्रदान करते हैं वह काम नहीं करेगा। – jangorecki

2

MySQL AUTO_INCREMENT जो उद्देश्यों को पूरा करती उपयोग करता है। लेकिन वहाँ मतभेद नीचे हैं:

MySQL Oracle करने के लिए AUTO_INCREMENTSEQUENCE मतभेद

  • AUTO_INCREMENT तालिका के अनुसार एक स्तंभ तक ही सीमित है
  • AUTO_INCREMENT एक विशिष्ट table.column (बहु तालिका उपयोग करने की अनुमति नहीं है) को सौंपा जाना चाहिए
  • AUTO_INCREMENT एक निर्दिष्ट नहीं स्तंभ, या शून्य

के एक मूल्य के रूप में सम्मिलित किया जाता है अगर आप चाहते हैं se ई MySQL के साथ एक अनुक्रम कार्यान्वयन, एसपी के साथ कर सकते हैं।

नीचे दिए गए लिंक का संदर्भ दें जो कुछ भी आप चाहते हैं उसे समझाया।

http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/

1

आप जो अभी तक अन्य प्रक्रियाओं जो ऑटो वेतन वृद्धि का उपयोग कर रहे परेशान किए बिना नहीं डाला हैं कि मेज ताकि आप पंक्तियों कर सकते हैं पर अगले मूल्य चाहते हैं?

कुछ विकल्प:

आगे बढ़ो और बस, "अनुक्रम का उपयोग करें" उन्हें लंबित के रूप में चिह्नित है और फिर उन्हें बाद में अद्यतन करने के लिए पंक्तियां सम्मिलित।

लेनदेन में डालें और लेनदेन को रद्द करें - ऑटो-संख्या अनुक्रम का उपयोग सामान्य रूप से किया जाना चाहिए और सामान्य रूप से तालिका में "अंतर" बनाना चाहिए - यह संख्या अब आपके लिए उपयोग करने के लिए स्वतंत्र है।

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

10

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

3.6.9। AUTO_INCREMENT

AUTO_INCREMENT विशेषता का उपयोग नई पंक्तियों के लिए एक अद्वितीय पहचान उत्पन्न करने के लिए इस्तेमाल किया जा सकता:

CREATE TABLE animals (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO animals (name) VALUES 
    ('dog'),('cat'),('penguin'), 
    ('lax'),('whale'),('ostrich'); 

SELECT * FROM animals; 
Which returns: 

+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | dog  | 
| 2 | cat  | 
| 3 | penguin | 
| 4 | lax  | 
| 5 | whale | 
| 6 | ostrich | 
+----+---------+ 

कोई मूल्य, AUTO_INCREMENT स्तंभ के लिए निर्दिष्ट किया गया था तो MySQL स्वचालित रूप से अनुक्रम संख्या सौंपा। अनुक्रम संख्या उत्पन्न करने के लिए आप स्तंभ में NULL या 0 को स्पष्ट रूप से असाइन भी कर सकते हैं।

आप LAST_INSERT_ID() SQL फ़ंक्शन या mysql_insert_id() सी एपीआई फ़ंक्शन के साथ सबसे हालिया AUTO_INCREMENT मान पुनर्प्राप्त कर सकते हैं। ये फ़ंक्शन कनेक्शन-विशिष्ट हैं, इसलिए उनके वापसी मान किसी अन्य कनेक्शन से प्रभावित नहीं होते हैं जो आवेषण भी कर रहा है।

AUTO_INCREMENT कॉलम के लिए सबसे छोटा पूर्णांक डेटा प्रकार का उपयोग करें जो अधिकतम अनुक्रम मान को रखने के लिए पर्याप्त है। जब कॉलम डेटा प्रकार की ऊपरी सीमा तक पहुंच जाता है, तो अनुक्रम संख्या उत्पन्न करने का अगला प्रयास विफल रहता है। यदि अधिक सीमा की अनुमति देने के लिए संभव हो तो UNSIGNED विशेषता का उपयोग करें। उदाहरण के लिए, यदि आप TINYINT का उपयोग करते हैं, तो अधिकतम अनुमत अनुक्रम संख्या 127 है। TINYINT के लिए हस्ताक्षर किए गए, अधिकतम 255 है। खंड 11.2.1, "पूर्णांक प्रकार (सटीक मान) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT देखें "सभी पूर्णांक प्रकारों की श्रेणियों के लिए।

नोट एकाधिक-पंक्ति सम्मिलित करने के लिए, LAST_INSERT_ID() और mysql_insert_id() वास्तव में डाली गई पंक्तियों में से पहले AUTO_INCREMENT कुंजी लौटाते हैं। यह एक प्रतिकृति सेटअप में अन्य सर्वरों पर बहु-पंक्ति प्रविष्टियों को सही ढंग से पुन: उत्पन्न करने में सक्षम बनाता है।

यदि ऑटोऑक्शनक्रिएशन कॉलम एकाधिक इंडेक्स का हिस्सा है, तो MySQL एक इंडेक्सक्रिएटमेंट कॉलम से शुरू होने वाली इंडेक्स का उपयोग करके अनुक्रम मान उत्पन्न करता है, यदि कोई है तो। उदाहरण के लिए, यदि जानवरों की तालिका में प्रिंटर कुंजी (जीआरपी, आईडी) और इंडेक्स (आईडी) इंडेक्स शामिल हैं, तो MySQL अनुक्रम मान उत्पन्न करने के लिए प्राथमिक कुंजी को अनदेखा कर देगा। नतीजतन, तालिका में एक अनुक्रम होगा, प्रति अनुक्रम प्रति अनुक्रम नहीं।

एक AUTO_INCREMENT 1 के अलावा अन्य मूल्य के साथ शुरू, टेबल बनाएं उस मान को सेट या टेबल बदल सकता है, इस तरह करने के लिए:

mysql> तालिका परिवर्तन tbl AUTO_INCREMENT = 100; इनो डीबी नोट्स

इनो डीबी टेबल के लिए, सावधान रहें यदि आप INSERT कथन के अनुक्रम के बीच में ऑटो-वृद्धि मूल्य वाले कॉलम को संशोधित करते हैं। उदाहरण के लिए, यदि आप स्वत: वृद्धि कॉलम में नया, बड़ा मान लगाने के लिए अद्यतन विवरण का उपयोग करते हैं, तो बाद में INSERT को "डुप्लिकेट एंट्री" त्रुटि मिल सकती है। परीक्षण करें कि एक ऑटो-वृद्धि मूल्य पहले से मौजूद है या नहीं, यदि आप अधिक INSERT कथन के बाद DELETE करते हैं, या जब आप लेनदेन को COMMIT करते हैं, लेकिन अपडेट स्टेटमेंट के बाद नहीं।

MyISAM नोट्स

MyISAM तालिकाओं के लिए, आप एक बहु-स्तंभ सूचकांक में एक माध्यमिक स्तंभ पर AUTO_INCREMENT निर्दिष्ट कर सकते हैं। इस मामले में, AUTO_INCREMENT कॉलम के लिए जेनरेट किया गया मान MAX (auto_increment_column) + 1 WHERE prefix = given-prefix के रूप में गणना की जाती है। यह तब उपयोगी होता है जब आप डेटा को क्रमबद्ध समूहों में रखना चाहते हैं।

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL, 
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (grp,id) 
) ENGINE=MyISAM; 

INSERT INTO animals (grp,name) VALUES 
    ('mammal','dog'),('mammal','cat'), 
    ('bird','penguin'),('fish','lax'),('mammal','whale'), 
    ('bird','ostrich'); 

SELECT * FROM animals ORDER BY grp,id; 
Which returns: 

+--------+----+---------+ 
| grp | id | name | 
+--------+----+---------+ 
| fish | 1 | lax  | 
| mammal | 1 | dog  | 
| mammal | 2 | cat  | 
| mammal | 3 | whale | 
| bird | 1 | penguin | 
| bird | 2 | ostrich | 
+--------+----+---------+ 

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

अतिरिक्त पठन

अधिक AUTO_INCREMENT के बारे में जानकारी यहाँ उपलब्ध है:

एक स्तंभ के लिए AUTO_INCREMENT विशेषता कैसे आवंटित करने के लिए: धारा 13.1.17, "CREATE TABLE सिंटेक्स", और धारा 13.1.7, " वैकल्पिक तालिका सिंटेक्स "।

कैसे AUTO_INCREMENT NO_AUTO_VALUE_ON_ZERO SQL मोड के आधार पर व्यवहार करता है: खंड 5.1.7, "सर्वर SQL मोड"।

सबसे हालिया AUTO_INCREMENT मान वाली पंक्ति को खोजने के लिए LAST_INSERT_ID() फ़ंक्शन का उपयोग कैसे करें: खंड 12.14, "सूचना कार्य"।

उपयोग करने के लिए AUTO_INCREMENT मान सेट करना: खंड 5.1.4, "सर्वर सिस्टम चर"।

स्वत: सुधार और प्रतिकृति: खंड 16.4.1.1, "प्रतिकृति और स्वत: सुधार"।

AUTO_INCREMENT (auto_increment_increment और auto_increment_offset) से संबंधित सर्वर-सिस्टम चर जो प्रतिकृति के लिए उपयोग किए जा सकते हैं: खंड 5.1.4, "सर्वर सिस्टम चर"।

http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0

0

MariaDBs SEQUENCE इंजन पर एक नज़र डालें।इसके साथ आप दृश्यों के रूप में आसान के रूप में

SELECT seq FROM seq_1_to_5; 
+-----+ 
| seq | 
+-----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+-----+ 

विवरण here: https://mariadb.com/kb/en/mariadb/sequence/

इस के साथ

आप मुझे लगता है कि उदाहरण देखा है, जबकि googling तरह

SELECT min(seq) as nextVal FROM seq_1_to_500 
WHERE seq NOT IN (SELECT ID FROM customers) 
+0

दिलचस्प बात है, लेकिन शायद सवाल का जवाब नहीं है। – hgoebl

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