Erstellen Sie eine temporäre Tabelle in einer SELECT-Anweisung ohne separate CREATE TABLE

494

Ist es möglich, eine temporäre Tabelle (nur Sitzung) aus einer select-Anweisung zu erstellen, ohne eine create table-Anweisung zu verwenden und jeden Spaltentyp anzugeben? Ich weiß, dass abgeleitete Tabellen dazu in der Lage sind, aber diese sind nur vorübergehend (nur Anweisungen) und ich möchte sie wiederverwenden.

Es würde Zeit sparen, wenn ich keinen Befehl zum Erstellen einer Tabelle schreiben und die Spaltenliste und die Typliste übereinstimmen müsste.

Bryan Field
quelle

Antworten:

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

Aus dem Handbuch unter http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Sie können das Schlüsselwort TEMPORARY verwenden, wenn Sie eine Tabelle erstellen. Eine TEMPORARY-Tabelle ist nur für die aktuelle Sitzung sichtbar und wird automatisch gelöscht, wenn die Sitzung geschlossen wird. Dies bedeutet, dass zwei verschiedene Sitzungen denselben temporären Tabellennamen verwenden können, ohne miteinander oder mit einer vorhandenen nicht temporären Tabelle mit demselben Namen in Konflikt zu geraten. (Die vorhandene Tabelle wird ausgeblendet, bis die temporäre Tabelle gelöscht wird.) Um temporäre Tabellen zu erstellen, müssen Sie über die Berechtigung CREATE TEMPORARY TABLES verfügen.

psparrow
quelle
8
Perfekt! Säulen mit optimaler Maximallänge und allem! Ich habe das Wort temporaryso hinzugefügt create temporary table mytable as select ....
Bryan Field
5
@ imperium2335, Vielleicht solltest du folgendes versuchen : create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Oder Sie können die "Standard-Engine für neue Tabellen" ändern. Ich stelle mir vor, dass dies in einer Variablen auf Sitzungsebene erfolgen kann. Besser noch, verwenden Sie die Schaltfläche Frage stellen oben rechts.
Bryan Field
10
Es ist nicht erforderlich, die Spaltennamen und -typen zu kennen. Dies war der Grund, warum der Fragesteller die Verwendung der Tabelle erstellen vermeiden wollte.
Spargel
30
Sie können es so verwenden, CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1wenn Sie
keine
1
Was meinst du mit Sitzung?
Saurabh Chandra Patel
137

Zusätzlich zur Antwort von psparrow, wenn Sie Ihrer temporären Tabelle einen Index hinzufügen müssen, gehen Sie wie folgt vor :

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

Es funktioniert auch mit PRIMARY KEY

RafaSashi
quelle
3
Kann Engine = Memory auch mit einer solchen Syntax verwendet werden?
DarkSide
6
@DarkSide Ja ENGINE = MEMORY kann ebenfalls verwendet werden. Siehe das folgende Beispiel: blog.cnizz.com/2010/11/24/…
RafaSashi
1
Was ist der Unterschied zwischen MyISAM und Memory Engine? Was sind die Vorteile des Gedächtnisses?
Yeahman
63

Verwenden Sie diese Syntax:

CREATE TEMPORARY TABLE t1 (select * from t2);
rizon
quelle
1
Das ist objektiver für das Kopieren von Daten! Großartig!
Rafael Gomes Francisco
54

Motor muss vor Auswahl sein:

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

ENGINE=MEMORYwird nicht unterstützt, wenn die Tabelle BLOB/ TEXTSpalten enthält

Krise
quelle
0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
user11949964
quelle