선택 항목의 인덱스를 사용하여 MySQL에서 임시 테이블 만들기


82

임시 테이블을 사용하는 저장 기능이 있습니다. 성능상의 이유로 해당 테이블에 인덱스가 필요합니다. 불행히도 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;

답변:


224

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에서 열에 대한 데이터 유형 재정의

    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

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;

@solick PRIMARY KEY은 항상 색인이 생성됩니다.
ebyrob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.