選択からのインデックスを使用してMySQLで一時テーブルを作成します


85

一時テーブルを使用するストアド関数があります。パフォーマンス上の理由から、そのテーブルにインデックスが必要です。残念ながら、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;

回答:


230

私はCREATETEMPORARY TABLESELECTの適切な構文とかなり長い間取り組んできました。いくつかのことを理解したので、私はコミュニティの他の人々と答えを共有したいと思いました。

ステートメントに関する基本情報は、次のMySQLリンクで入手できます。

CREATE TABLESELECTおよびCREATETABLE

仕様を解釈するのが難しい場合があります。ほとんどの人は例から最もよく学ぶので、私がどのように実用的なステートメントを作成したか、そしてあなたがあなたのためにそれをどのように修正できるかを共有します。

  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からの列のデータ型の再定義

    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
    

6
あなたは私の一日を作りました、これは本当に役に立ちました!
bastiaanWW 2014

7
役に立たない「ありがとう」のコメントのように聞こえるリスクがありますが、あなたが私の戦利品を救ったことを知ってほしいです。ただ賛成するだけでなく、もっとたくさんのことをしたいと思います。インデックス付きの一時テーブルは、一時テーブルをそれ自体に結合するという制限を回避するために結合できます。私の場合、インデックスは不可欠だったようです。
プラズマロブ2018年

13

私自身で答えを見つけました。私の問題は、結合に2つの一時テーブルを使用し、最初のテーブルから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;

...私の問題を解決しました。

ご挨拶...


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 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.