Ich habe eine ganze Weile mit der richtigen Syntax für CREATE TEMPORARY TABLE SELECT gerungen. Nachdem ich ein paar Dinge herausgefunden hatte, wollte ich die Antworten mit dem Rest der Community teilen.
Grundlegende Informationen zur Anweisung finden Sie unter den folgenden MySQL-Links:
CREATE TABLE SELECT und CREATE TABLE .
Manchmal kann es entmutigend sein, die Spezifikation zu interpretieren. Da die meisten Menschen am besten aus Beispielen lernen, werde ich erläutern, wie ich eine Arbeitsanweisung erstellt habe und wie Sie sie so ändern können, dass sie für Sie funktioniert.
Fügen Sie mehrere Indizes hinzu
Diese Anweisung zeigt, wie Sie mehrere Indizes hinzufügen (beachten Sie, dass Indexnamen - in Kleinbuchstaben - optional sind):
CREATE TEMPORARY TABLE core.my_tmp_table
(INDEX my_index_name (tag, time), UNIQUE my_unique_index_name (order_number))
SELECT * FROM core.my_big_table
WHERE my_val = 1
Fügen Sie einen neuen Primärschlüssel hinzu :
CREATE TEMPORARY TABLE core.my_tmp_table
(PRIMARY KEY my_pkey (order_number),
INDEX cmpd_key (user_id, time))
SELECT * FROM core.my_big_table
Erstellen Sie zusätzliche Spalten
Sie können eine neue Tabelle mit mehr Spalten erstellen, als in der SELECT-Anweisung angegeben sind. Geben Sie die zusätzliche Spalte in der Tabellendefinition an. In der Tabellendefinition angegebene und in select nicht gefundene Spalten sind die ersten Spalten in der neuen Tabelle, gefolgt von den durch die SELECT-Anweisung eingefügten Spalten.
CREATE TEMPORARY TABLE core.my_tmp_table
(my_new_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY my_pkey (my_new_id), INDEX my_unique_index_name (invoice_number))
SELECT * FROM core.my_big_table
Neudefinition der Datentypen für die Spalten in SELECT
Sie können den Datentyp einer Spalte, die ausgewählt wird, neu definieren. Im folgenden Beispiel ist das Spalten-Tag ein MEDIUMINT in core.my_big_table und ich definiere es neu in einen BIGINT in core.my_tmp_table.
CREATE TEMPORARY TABLE core.my_tmp_table
(tag BIGINT,
my_time DATETIME,
INDEX my_unique_index_name (tag) )
SELECT * FROM core.my_big_table
Erweiterte Felddefinitionen beim Erstellen
Alle üblichen Spaltendefinitionen sind verfügbar, wenn Sie eine normale Tabelle erstellen. Beispiel:
CREATE TEMPORARY TABLE core.my_tmp_table
(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
value BIGINT UNSIGNED NOT NULL DEFAULT 0 UNIQUE,
location VARCHAR(20) DEFAULT "NEEDS TO BE SET",
country CHAR(2) DEFAULT "XX" COMMENT "Two-letter country code",
INDEX my_index_name (location))
ENGINE=MyISAM
SELECT * FROM core.my_big_table
Habe die Antwort alleine gefunden. Mein Problem war, dass ich zwei temporäre Tabellen für einen Join verwende und die zweite aus der ersten erstelle. Der Index wurde jedoch während der Erstellung nicht kopiert ...
CREATE TEMPORARY TABLE tmpLivecheck (tmpid INTEGER NOT NULL AUTO_INCREMENT, PRIMARY KEY(tmpid), INDEX(tmpid)) SELECT * FROM tblLivecheck_copy WHERE tblLivecheck_copy.devId = did; CREATE TEMPORARY TABLE tmpLiveCheck2 (tmpid INTEGER NOT NULL, PRIMARY KEY(tmpid), INDEX(tmpid)) SELECT * FROM tmpLivecheck;
... mein Problem gelöst.
Schöne Grüße...
quelle
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] select_statement
Beispiel:
CREATE TEMPORARY TABLE IF NOT EXISTS mytable (id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM; INSERT IGNORE INTO mytable SELECT id FROM table WHERE xyz;
quelle
PRIMARY KEY
ist immer indiziert.