Erstellen Sie eine temporäre Tabelle in MySQL mit einem Index aus einer Auswahl

81

Ich habe eine gespeicherte Funktion, in der ich temporäre Tabellen verwende. Aus Leistungsgründen benötige ich einen Index in dieser Tabelle. Leider kann ich nicht verwenden, ALTER TABLEda dies ein implizites Commit verursacht.

Daher suche ich nach der Syntax, um die INDEXfür tempidwährend der Erstellung hinzuzufügen . Kann jemand helfen?

CREATE TEMPORARY TABLE tmpLivecheck 
(
    tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM   tblLivecheck_copy
WHERE  tblLivecheck_copy.devId = did;
Solick
quelle

Antworten:

222

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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
IvanD
quelle
6
Du hast meinen Tag gemacht, das war wirklich hilfreich!
BastiaanWW
7
Ich möchte, dass Sie wissen, dass Sie meine Beute gerettet haben. Ich wünschte, ich hätte mehr zu geben als nur eine Gegenstimme. Temporäre Tabellen mit Indizes können verknüpft werden, um die Einschränkung des Verbindens einer temporären Tabelle mit sich selbst zu umgehen, und in meinem Fall schien der Index wesentlich zu sein.
Plasmarob
12

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...

Solick
quelle
4
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;
Ayush Bilala
quelle
@solick PRIMARY KEYist immer indiziert.
Ebyrob