web-dev-qa-db-fra.com

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 performances, j'ai besoin d'un index dans cette table. Malheureusement, je ne peux pas utiliser ALTER TABLE parce que cela provoque une validation implicite.

Par conséquent, je cherche la syntaxe pour ajouter le INDEX à tempid lors de la création. Quelqu'un peut-il être utile?

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

J'ai trouvé la réponse moi-même. Mon problème était que j'utilise deux tables temporaires pour une jointure et crée la seconde sur la première. Mais l'Index 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...

9
solick

J'ai longuement lutté avec la syntaxe appropriée pour CREATE TEMPORARY TABLE SELECT. Après avoir compris quelques points, je voulais partager les réponses avec le reste de la communauté.

Des informations de base sur la déclaration sont disponibles aux liens MySQL suivants:

CREATE TABLE SELECT et CREATE TABLE .

Parfois, il peut être difficile d’interpréter les spécifications. Étant donné que la plupart des gens apprennent mieux à partir d'exemples, je partagerai comment j'ai créé une déclaration de travail et comment vous pouvez la modifier pour qu'elle fonctionne à votre place.

  1. Ajouter plusieurs index

    Cette instruction montre comment ajouter plusieurs index (notez que les noms d'index - en minuscule - 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 une nouvelle table avec plus de colonnes que celles spécifiées dans l'instruction SELECT. Spécifiez la colonne supplémentaire dans la définition de la table. Les colonnes spécifiées dans la définition de table et non trouvées dans select seront les premières colonnes de la nouvelle table, suivies des colonnes insérées par l'instruction 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éfinition des types de données pour les colonnes de SELECT

    Vous pouvez redéfinir le type de données d'une colonne en cours de sélection. Dans l'exemple ci-dessous, la balise column est un MEDIUMINT dans core.my_big_table et je le redéfinis en un BIGINT dans core.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éfinitions de champ avancées lors de la création

    Toutes les définitions de colonne habituelles sont disponibles comme lorsque 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
    
177
IvanD
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;
4
Ayush Bilala