在MySQL中使用选择索引创建临时表


82

我有一个使用临时表的存储函数。出于性能原因,我需要在该表中创建一个索引。不幸的是,我无法使用,ALTER TABLE因为这会导致隐式提交。

所以我在寻找的语法来添加INDEXtempid创建过程中。谁能帮忙?

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

Answers:


224

我为CREATE TEMPORARY TABLE SELECT的正确语法费了不少时间。弄清楚了几件事之后,我想与社区其他成员分享答案。

以下语句链接提供了有关该语句的基本信息:

CREATE TABLE SELECTCREATE TABLE

有时,解释规范可能会令人生畏。由于大多数人从示例中学到的知识最多,所以我将分享如何创建工作声明以及如何修改它以适合您的需求。

  1. 添加多个索引

    该语句显示了如何添加多个索引(请注意,索引名称(小写)是可选的):

    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. 添加一个新的主键

    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. 创建其他列

    您可以使用比SELECT语句中指定的列更多的列来创建新表。在表定义中指定其他列。在表定义中指定但在select中找不到的列将是新表中的第一列,然后是SELECT语句插入的列。

    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. 重新定义SELECT列的数据类型

    您可以重新定义被选择的列的数据类型。在下面的示例中,column标签在core.my_big_table中是MEDIUMINT,我将其重新定义为core.my_tmp_table中的BIGINT。

    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. 创建期间的高级字段定义

    创建普通表时,所有常规列定义均可用。例:

    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
    

6
你让我开心,这真的很有帮助!
2014年

7
冒着听起来像无用的“谢谢”评论的危险,我希望您知道您保存了我的赃物。我希望我能付出的不仅仅是投票。可以将带有索引的临时表联接起来,以规避将临时表与其自身联接的限制,在我看来,索引是必不可少的。
Plasmarob

13

确实找到了答案。我的问题是,我使用两个临时表进行联接并从第一个临时表中创建第二个临时表。但是索引在创建过程中没有被复制...

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;

...解决了我的问题。

问候...


5
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

范例:

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;

@solickPRIMARY KEY总是被索引。
ebyrob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.