使用select中的索引在MySQL中创建临时表

sol*_*ick 62 mysql ddl temp-tables

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

所以我在寻找的语法来添加INDEXtempid创建过程中.任何人都可以帮忙吗?

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

Iva*_*anD 182

我用CREATE TEMPORARY TABLE SELECT的正确语法摔了一会儿.在弄清楚了一些事情后,我想与社区其他成员分享答案.

有关该语句的基本信息可从以下MySQL链接获得:

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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

  • 冒着听起来像无用的"谢谢"评论的风险,我想让你知道你救了我的战利品.我希望我能提供更多的东西而不仅仅是一个赞成.可以连接带有索引的临时表来规避将临时表连接到自身的限制,在我的情况下,索引似乎是必不可少的. (6认同)
  • 你结识了我的一天,这真的很有帮助! (4认同)

sol*_*ick 9

我自己找到了答案.我的问题是,我使用两个临时表进行连接,并从第一个创建第二个.但在创建期间没有复制索引......

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;
Run Code Online (Sandbox Code Playgroud)

...解决了我的问题.

问候...


小智 5

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement
Run Code Online (Sandbox Code Playgroud)

例子 :

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;
Run Code Online (Sandbox Code Playgroud)