99

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

因此,我正在寻找在创建期间添加INDEXfor的语法。tempid任何人都可以提供帮助吗?

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

3 回答 3

263

我为 CREATE TEMPORARY TABLE SELECT 的正确语法挣扎了很长时间。弄清楚了一些事情后,我想与社区的其他人分享答案。

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

创建表选择创建表

有时,解释规范可能会令人生畏。由于大多数人从示例中学习得最好,我将分享我是如何创建工作语句的,以及如何修改它以适合你。

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

    您可以重新定义正在选择的列的数据类型。在下面的示例中,列标记是 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
    
于 2013-09-25T02:29:22.017 回答
17

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

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;

...解决了我的问题。

问候...

于 2013-01-18T11:50:16.533 回答
6
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;
于 2013-01-18T11:30:57.960 回答