Створіть тимчасову таблицю в 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

Я досить довго боровся з правильним синтаксисом для 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

    Ви можете перевизначити тип даних стовпця, який вибирається. У наведеному нижче прикладі тег стовпця є MEDIUMINT у core.my_big_table, і я перевизначаю його у BIGINT у 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. Розширені визначення полів під час створення

    Доступні всі звичайні визначення стовпців, як при створенні звичайної таблиці. Приклад:

    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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.