Créer une table temporaire dans MySQL avec un index à partir d'un select

j'ai une fonction stockée où j'utilise des tables temporaires. Pour des raisons de performance, j'ai besoin d'un indice dans ce tableau. Malheureusement, je ne peux pas utiliser ALTER TABLE parce que cela provoque un commit implicite.

donc je cherche la syntaxe pour ajouter le INDEXtempid pendant la création. Quelqu'un peut-il les aider?

CREATE TEMPORARY TABLE tmpLivecheck 
(
    tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM   tblLivecheck_copy
WHERE  tblLivecheck_copy.devId = did;
38
demandé sur Namphibian 2013-01-18 15:17:04

3 réponses

j'ai lutté assez longtemps avec la bonne syntaxe pour créer la sélection de TABLE temporaire. Ayant trouvé quelques choses, j'ai voulu partager les réponses avec le reste de la communauté.

des informations de base sur la Déclaration sont disponibles sur les liens MySQL suivants:

CREATE TABLE SELECT et CREATE TABLE.

parfois, il peut être difficile d'interpréter les spécifications. Puisque la plupart des gens apprennent mieux des exemples, je vais partagez comment j'ai créé une déclaration de travail, et comment vous pouvez la modifier pour travailler pour vous.

  1. Ajouter plusieurs index

    Cette déclaration montre comment ajouter plusieurs index (notez que les noms d'index en bas de casse - sont facultatifs):

    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. Ajouter une nouvelle clé primaire:

    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. Créer des colonnes supplémentaires

    Vous pouvez créer un nouveau tableau avec plus de colonnes que celles spécifiées dans L'énoncé SELECT. Spécifiez la colonne supplémentaire dans la définition du tableau. Les colonnes spécifiées dans la définition du tableau et qui ne se trouvent pas dans select seront les premières colonnes du nouveau tableau, suivies des colonnes insérées par L'énoncé SELECT.

    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. redéfinir les types de données pour les colonnes à partir de SELECT

    vous pouvez redéfinir le type de données d'une colonne sélectionnée. Dans l'exemple ci-dessous, l'étiquette de colonne est un MÉDIUMINT dans le noyau.my_big_table et moi sommes en train de le redéfinir à un BIGINT dans le cœur.my_tmp_table.

    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. définition avancée des champs lors de la création

    toutes les définitions habituelles des colonnes sont disponibles comme quand vous créez une table normale. Exemple:

    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
    
135
répondu IvanD 2015-05-04 03:15:21

A trouvé la réponse sur mon propre. Mon problème, c'est que j'utilise deux tables temporaires pour rejoindre et de créer la seconde de la première. Toutefois, l'Indice n'a pas été copié lors de la création...

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;

... résolu mon problème.

Salutations...

6
répondu solick 2013-01-18 11:50:16
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

Exemple :

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;
3
répondu Ayush Bilala 2013-01-18 11:30:57