567 votes

Créer une table temporaire dans une instruction SELECT sans créer une table distincte CREATE TABLE

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

Je gagnerais du temps si je n'avais pas à rédiger une commande de création de table et à faire correspondre la liste des colonnes et la liste des types.

894voto

psparrow Points 2962
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

Le manuel se trouve à l'adresse suivante 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 est visible uniquement pour la session en cours et est abandonné 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 votes

Parfait ! Des colonnes avec des longueurs maximales optimales et tout ! J'ai ajouté le mot temporary donc create temporary table mytable as select ... .

0 votes

Comment pouvez-vous spécifier le moteur de cette table ? par exemple MEMORY J'ai essayé ENGINE=MEMORY mais cela me donne une erreur de syntaxe.

5 votes

@imperium2335, Vous devriez peut-être essayer ce qui suit : create table t as select ... limit 0; alter table t engine=memory; insert into t select ... . Ou, peut-être pouvez-vous changer le "moteur par défaut des nouvelles tables". J'imagine que cela peut être fait dans une variable au niveau de la session. Mieux encore, utilisez le bouton "Poser une question" en haut à droite.

156voto

RafaSashi Points 1492

En plus de de psparrow répondre si nécessaire ajouter un index à votre table temporaire font :

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 votes

Peut-on aussi utiliser Engine=Memory avec cette syntaxe ?

6 votes

@DarkSide Oui ENGINE=MEMORY peut aussi être utilisé. Voir l'exemple suivant : blog.cnizz.com/2010/11/24/…

1 votes

Quelle est la différence entre MyISAM et le moteur de mémoire ? quels sont les avantages de la mémoire ?

68voto

rizon Points 2751

Utilisez cette syntaxe :

CREATE TEMPORARY TABLE t1 (select * from t2);

1 votes

C'est plus objectif pour les données de copie ! Super !

58voto

Crusader Points 338

Le moteur doit être avant la sélection :

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

44voto

Cris Points 239

ENGINE=MEMORY n'est pas supporté lorsque le tableau contient BLOB / TEXT colonnes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X