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.

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.


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


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


54

Motor muss vor Auswahl sein:

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

39

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


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.