Créer une table temporaire dans une instruction SELECT sans CREATE TABLE séparée

494

Est-il possible de créer une table temporaire (session uniquement) à partir d'une instruction select sans utiliser une instruction create table et sans spécifier chaque type de colonne? Je sais que les tables dérivées sont capables de cela, mais celles-ci sont super-temporaires (instruction uniquement) et je veux les réutiliser.

Cela gagnerait du temps si je n'avais pas à écrire une commande de création de table et à conserver la liste des colonnes et la liste des types correspondant.

Bryan Field
la source

Réponses:

789
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

Extrait du manuel disponible sur http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Vous pouvez utiliser le mot clé TEMPORARY lors de la création d'une table. Une table TEMPORAIRE n'est visible que pour la session en cours et est supprimée automatiquement lorsque la session est fermée. Cela signifie que deux sessions différentes peuvent utiliser le même nom de table temporaire sans entrer en conflit l'une avec l'autre ou avec une table non TEMPORAIRE existante du même nom. (La table existante est masquée jusqu'à ce que la table temporaire soit supprimée.) Pour créer des tables temporaires, vous devez disposer du privilège CREATE TEMPORARY TABLES.

psparrow
la source
8
Parfait! Colonnes avec des longueurs maximales optimales et tout! J'ai ajouté le mot temporaryainsi create temporary table mytable as select ....
Bryan Field
5
@ imperium2335, peut-être vous devriez essayer ce qui suit: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Ou, vous pouvez peut-être changer le "moteur par défaut des nouvelles tables". J'imagine que cela peut être fait dans une variable de niveau session. Mieux encore, utilisez le bouton Poser une question en haut à droite.
Bryan Field
10
Cela ne nécessite pas de connaître les noms et les types de colonnes, ce qui était la raison pour laquelle l'interrogateur voulait éviter d'utiliser Créer une table.
psparrow
30
vous pouvez l'utiliser comme ceci CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1si vous ne voulez pas copier les données, structurez simplement
dzona
1
qu'entendez-vous par session?
Saurabh Chandra Patel
137

En plus de la réponse de psparrow si vous devez ajouter un index à votre table temporaire, faites:

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

Il fonctionne également avec PRIMARY KEY

RafaSashi
la source
3
Engine = Memory peut-il également être utilisé avec une telle syntaxe?
DarkSide
6
@DarkSide Oui ENGINE = MEMORY peut également être utilisé. Voir l'exemple suivant: blog.cnizz.com/2010/11/24/…
RafaSashi
1
quelle est la différence entre MyISAM et le moteur de mémoire? quels sont les avantages de la mémoire?
yeahman
63

Utilisez cette syntaxe:

CREATE TEMPORARY TABLE t1 (select * from t2);
rizon
la source
1
C'est plus objectif pour copier des données! Génial!
Rafael Gomes Francisco
54

Le moteur doit être avant de sélectionner:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
Croisé
la source
39

ENGINE=MEMORYn'est pas pris en charge lorsque la table contient BLOB/ TEXTcolonnes

Cris
la source
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
user11949964
la source