Tạo một bảng tạm thời trong MySQL với một chỉ mục từ một lựa chọn


82

Tôi có một hàm được lưu trữ nơi tôi sử dụng các bảng tạm thời. Vì lý do hiệu suất, tôi cần một chỉ mục trong bảng đó. Rất tiếc, tôi không thể sử dụng ALTER TABLEvì điều này gây ra một cam kết ngầm.

Do đó, tôi đang tìm kiếm cú pháp để thêm INDEXfor tempidtrong quá trình tạo. Bất cứ ai có thể được giúp đỡ?

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

Câu trả lời:


224

Tôi đã vật lộn khá lâu với cú pháp thích hợp để TẠO CHỌN BẢNG TẠM THỜI. Sau khi tìm ra một vài điều, tôi muốn chia sẻ câu trả lời với những người còn lại trong cộng đồng.

Thông tin cơ bản về câu lệnh có sẵn tại các liên kết MySQL sau:

TẠO BẢNG CHỌNTẠO BẢNG .

Đôi khi, việc giải thích thông số kỹ thuật có thể gây khó khăn. Vì hầu hết mọi người học tốt nhất từ ​​các ví dụ, tôi sẽ chia sẻ cách tôi đã tạo một câu lệnh làm việc và cách bạn có thể sửa đổi nó để phù hợp với mình.

  1. Thêm nhiều chỉ mục

    Câu lệnh này chỉ ra cách thêm nhiều chỉ mục (lưu ý rằng tên chỉ mục - trong trường hợp viết thường - là tùy chọn):

    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. Thêm khóa chính mới :

    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. Tạo các cột bổ sung

    Bạn có thể tạo một bảng mới với nhiều cột hơn số cột được chỉ định trong câu lệnh SELECT. Chỉ định cột bổ sung trong định nghĩa bảng. Các cột được chỉ định trong định nghĩa bảng và không được tìm thấy trong select sẽ là các cột đầu tiên trong bảng mới, tiếp theo là các cột được chèn bởi câu lệnh 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. Định nghĩa lại kiểu dữ liệu cho các cột từ SELECT

    Bạn có thể xác định lại kiểu dữ liệu của cột đang được CHỌN. Trong ví dụ bên dưới, thẻ cột là MEDIUMINT trong core.my_big_table và tôi đang định nghĩa lại nó thành BIGINT trong core.my_tmp_table.

    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. Định nghĩa trường nâng cao trong quá trình tạo

    Tất cả các định nghĩa cột thông thường đều có sẵn như khi bạn tạo một bảng bình thường. Thí dụ:

    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
Bạn đã làm cho ngày của tôi, điều này thực sự hữu ích!
BastiaanWW

7
Có nguy cơ nghe như một nhận xét "cảm ơn" vô ích, tôi muốn bạn biết rằng bạn đã cứu chiến lợi phẩm của tôi. Tôi ước mình có nhiều thứ để cho hơn là chỉ một ủng hộ. Các bảng tạm thời có chỉ mục có thể được kết hợp để tránh giới hạn của việc kết hợp một bảng tạm thời với chính nó, và có vẻ như trong trường hợp của tôi, chỉ mục là cần thiết.
Plasmarob

13

Đã tìm thấy câu trả lời của riêng tôi. Vấn đề của tôi là tôi sử dụng hai bảng tạm thời cho một phép nối và tạo bảng thứ hai trong số bảng đầu tiên. Nhưng Chỉ mục không được sao chép trong quá trình tạo ...

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;

... đã giải quyết vấn đề của tôi.

Lời chào hỏi...


5
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
select_statement

Thí dụ :

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 KEYluôn được lập chỉ mục.
ebyrob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.