【问题标题】:Create a temporary table in MySQL with an index from a select在 MySQL 中使用来自 select 的索引创建一个临时表
【发布时间】:2013-01-02 02:18:31
【问题描述】:

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

因此,我正在寻找在创建过程中为tempid 添加INDEX 的语法。有人可以帮忙吗?

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

【问题讨论】:

    标签: mysql ddl temp-tables


    【解决方案1】:

    我为 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
      
    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
      

    【讨论】:

    • 你让我开心,这真的很有帮助!
    • 冒着听起来像是无用的“谢谢”评论的风险,我想让你知道你救了我的战利品。我希望我能给予的不仅仅是赞成票。可以连接带有索引的临时表以规避将临时表连接到自身的限制,在我的情况下,索引似乎是必不可少的。
    【解决方案2】:

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

    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;
    

    ...解决了我的问题。

    您好……

    【讨论】:

      【解决方案3】:
      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;
      

      【讨论】:

      • @solick PRIMARY KEY 始终被编入索引。
      猜你喜欢
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2020-02-25
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多