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.

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.


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


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


54

Le moteur doit être avant de sélectionner:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)

39

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


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.