एक चयन से एक सूचकांक के साथ MySQL में एक अस्थायी तालिका बनाएं


84

मेरे पास एक संग्रहीत फ़ंक्शन है जहां मैं अस्थायी तालिकाओं का उपयोग करता हूं। प्रदर्शन कारणों से, मुझे उस तालिका में एक सूचकांक चाहिए। दुर्भाग्य से, मैं उपयोग नहीं कर सकता ALTER TABLEक्योंकि यह एक अंतर्निहित प्रतिबद्ध का कारण बनता है।

इसलिए मैं निर्माण INDEXके tempidदौरान वाक्य जोड़ने के लिए वाक्यविन्यास की तलाश कर रहा हूं । क्या कोई मदद कर सकता है?

CREATE TEMPORARY TABLE tmpLivecheck 
(
    tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM   tblLivecheck_copy
WHERE  tblLivecheck_copy.devId = did;

जवाबों:


229

मैंने क्रिएट टेम्परेरी टेबल सेलेक्ट के लिए उचित सिंटैक्स के साथ काफी समय कुश्ती की। कुछ चीजों का पता लगाकर, मैं बाकी समुदाय के साथ जवाब साझा करना चाहता था।

कथन के बारे में मूल जानकारी निम्नलिखित MySQL लिंक पर उपलब्ध है:

बनाएँ का चयन करें और बनाएँ तालिका

कई बार युक्ति की व्याख्या करना कठिन हो सकता है। चूंकि अधिकांश लोग उदाहरणों से सर्वश्रेष्ठ सीखते हैं, इसलिए मैं साझा करूंगा कि मैंने कैसे एक कामकाजी वक्तव्य बनाया है, और आप इसे आपके लिए काम करने के लिए कैसे संशोधित कर सकते हैं।

  1. कई अनुक्रमित जोड़ें

    यह कथन दिखाता है कि कई अनुक्रमित कैसे जोड़े जाएं (ध्यान दें कि सूचकांक के नाम - निचले मामले में - वैकल्पिक हैं):

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (INDEX my_index_name (tag, time), UNIQUE my_unique_index_name (order_number))
    SELECT * FROM core.my_big_table
    WHERE my_val = 1
    
  2. एक नई प्राथमिक कुंजी जोड़ें :

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (PRIMARY KEY my_pkey (order_number),
    INDEX cmpd_key (user_id, time))
    SELECT * FROM core.my_big_table
    
  3. अतिरिक्त कॉलम बनाएं

    आप सेलेक्ट स्टेटमेंट में निर्दिष्ट किए गए से अधिक कॉलम के साथ एक नई तालिका बना सकते हैं। तालिका परिभाषा में अतिरिक्त कॉलम निर्दिष्ट करें। तालिका परिभाषा में निर्दिष्ट कॉलम और चयन में नहीं पाया गया, नए तालिका में पहले कॉलम होंगे, उसके बाद सेलेक्ट स्टेटमेंट द्वारा कॉलम डाले जाएंगे।

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (my_new_id BIGINT NOT NULL AUTO_INCREMENT,  
    PRIMARY KEY my_pkey (my_new_id), INDEX my_unique_index_name (invoice_number))
    SELECT * FROM core.my_big_table
    
  4. सेलेक्ट के कॉलम के लिए डेटा प्रकारों को फिर से परिभाषित करना

    आप स्तंभ के डेटा प्रकार का चयन कर उसे फिर से परिभाषित कर सकते हैं। नीचे दिए गए उदाहरण में, कॉलम टैग core.my_big_table में एक MEDIUMINT है और मैं इसे core.my_tmp_table में एक BIGINT पर पुनः परिभाषित कर रहा हूं।

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (tag BIGINT,
    my_time DATETIME,  
    INDEX my_unique_index_name (tag) )
    SELECT * FROM core.my_big_table
    
  5. बनाने के दौरान उन्नत फ़ील्ड परिभाषाएँ

    जब आप एक सामान्य तालिका बनाते हैं तो सभी सामान्य स्तंभ परिभाषाएँ उपलब्ध होती हैं। उदाहरण:

    CREATE TEMPORARY TABLE core.my_tmp_table 
    (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    value BIGINT UNSIGNED NOT NULL DEFAULT 0 UNIQUE,
    location VARCHAR(20) DEFAULT "NEEDS TO BE SET",
    country CHAR(2) DEFAULT "XX" COMMENT "Two-letter country code",  
    INDEX my_index_name (location))
    ENGINE=MyISAM 
    SELECT * FROM core.my_big_table
    

6
आपने मेरा दिन बना दिया, यह वास्तव में मददगार था!
बस्तियानव्यू

7
एक बेकार "धन्यवाद" टिप्पणी की तरह लगने के जोखिम पर, मैं चाहता हूं कि आप यह जान सकें कि आपने मेरी लूट को बचाया। काश मैं सिर्फ एक upvote से अधिक देने के लिए था। अनुक्रमित के साथ अस्थायी तालिकाओं में शामिल होने के लिए एक अस्थायी तालिका में खुद को शामिल करने की सीमा को दरकिनार किया जा सकता है, और ऐसा लगता है कि मेरे मामले में सूचकांक आवश्यक था।
प्लास्माब्रोब

13

इसका जवाब मुझे खुद ही मिल गया। मेरी समस्या यह थी, कि मैं एक जुड़ाव के लिए दो अस्थायी तालिकाओं का उपयोग करता हूं और पहले वाले से दूसरे को बनाता हूं। लेकिन सृजन के दौरान सूचकांक की नकल नहीं की गई ...

CREATE TEMPORARY TABLE tmpLivecheck (tmpid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY    
KEY(tmpid), INDEX(tmpid))
SELECT * FROM tblLivecheck_copy WHERE tblLivecheck_copy.devId = did;

CREATE TEMPORARY TABLE tmpLiveCheck2 (tmpid INTEGER NOT NULL, PRIMARY KEY(tmpid), 
INDEX(tmpid))  
SELECT * FROM tmpLivecheck;

... मेरी समस्या हल कर दी।

अभिवादन...


5
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

उदाहरण :

CREATE TEMPORARY TABLE IF NOT EXISTS mytable
(id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM;
INSERT IGNORE INTO mytable SELECT id FROM table WHERE xyz;

@ सोलिक PRIMARY KEYहमेशा अनुक्रमित होता है।
एरोब्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.