MySQL'de bir seçimden bir indeksle geçici bir tablo oluşturun


85

Geçici tabloları kullandığım depolanmış bir işlevim var. Performans nedenleriyle, o tabloda bir dizine ihtiyacım var. Maalesef kullanamıyorum ALTER TABLEçünkü bu örtük bir işleme neden oluyor.

Bu nedenle, INDEXoluşturma tempidsırasında for 'u eklemek için sözdizimini arıyorum . Biri yardımcı olabilir mi?

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

Yanıtlar:


230

CREATE TEMPORARY TABLE SELECT için uygun sözdizimi ile epeyce mücadele ettim. Birkaç şeyi çözdükten sonra, cevapları topluluğun geri kalanıyla paylaşmak istedim.

İfade hakkındaki temel bilgiler aşağıdaki MySQL bağlantılarında mevcuttur:

TABLO SEÇİMİ OLUŞTURUN ve TABLO OLUŞTURUN .

Bazen özellikleri yorumlamak göz korkutucu olabilir. Çoğu insan en iyi örneklerden öğrendiğinden, bir çalışma bildirimini nasıl oluşturduğumu ve işinize yarayacak şekilde bunu nasıl değiştirebileceğinizi paylaşacağım.

  1. Birden çok dizin ekle

    Bu ifade, birden çok dizinin nasıl ekleneceğini gösterir (küçük harflerle dizin adlarının isteğe bağlı olduğunu unutmayın):

    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. Yeni bir birincil anahtar ekleyin :

    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. Ek sütunlar oluşturun

    SELECT deyiminde belirtilenden daha fazla sütuna sahip yeni bir tablo oluşturabilirsiniz. Tablo tanımında ek sütunu belirtin. Tablo tanımında belirtilen ve select içinde bulunmayan sütunlar, yeni tablodaki ilk sütunlar ve ardından SELECT deyimi tarafından eklenen sütunlar olacaktır.

    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. SELECT'ten sütunlar için veri türlerini yeniden tanımlama

    SEÇİLEN bir sütunun veri türünü yeniden tanımlayabilirsiniz. Aşağıdaki örnekte, sütun etiketi core.my_big_table'da bir ORTA ve ben core.my_tmp_table'da onu BIGINT olarak yeniden tanımlıyorum.

    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. Oluşturma sırasında gelişmiş alan tanımları

    Normal bir tablo oluşturduğunuzdaki gibi tüm olağan sütun tanımları mevcuttur. Misal:

    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
Günümü sen yaptın, bu gerçekten yardımcı oldu!
BastiaanWW

7
Yararsız bir "teşekkürler" yorumu gibi görünme riskiyle, ganimetimi kurtardığını bilmeni istiyorum. Keşke bir oy vermekten daha fazlasını verebilseydim. Geçici bir tablonun kendisine katılma sınırlamasını aşmak için indeksli geçici tablolar birleştirilebilir ve benim durumumda indeks önemliydi.
Plasmarob

13

Cevabı kendim buldum. Benim sorunum, birleştirme için iki geçici tablo kullanmam ve ikincisini ilkinden oluşturmamdı. Ancak Dizin oluşturma sırasında kopyalanmadı ...

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;

... sorunumu çözdü.

Selamlar...


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

Misal :

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;

@solick PRIMARY KEYher zaman dizine alınır.
ebyrob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.