Создайте временную таблицу в MySQL с индексом из select
у меня есть хранимая функция, где я использую временные таблицы. По соображениям производительности мне нужен индекс в этой таблице. К сожалению, я не могу использовать ALTER TABLE
потому что это вызывает неявную фиксацию.
поэтому я ищу синтаксис для добавления INDEX
на tempid
во время создания. Кто-нибудь может помочь?
CREATE TEMPORARY TABLE tmpLivecheck
(
tmpid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY
)
SELECT *
FROM tblLivecheck_copy
WHERE tblLivecheck_copy.devId = did;
3 ответов
Я довольно долго боролся с правильным синтаксисом для создания временной таблицы SELECT. Выяснив несколько вещей, я хотел поделиться ответами с остальной частью сообщества.
основная информация о заявлении доступна по следующим ссылкам MySQL:
СОЗДАТЬ ТАБЛИЦУ ВЫБЕРИТЕ и СОЗДАТЬ ТАБЛИЦУ.
иногда может быть сложно интерпретировать спецификацию. Поскольку большинство людей лучше всего учатся на примерах, я буду поделитесь тем, как я создал рабочий оператор и как вы можете изменить его, чтобы он работал на вас.
-
добавить несколько индексов
этот оператор показывает, как добавить несколько индексов (обратите внимание, что имена индексов - в нижнем регистре - необязательны):
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
-
Добавить новый первичный ключ:
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
-
создать дополнительные столбцы
вы можете создать новая таблица с большим количеством столбцов, чем указано в инструкции 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
-
переопределение типов данных для столбцов из 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
-
расширенные определения полей во время создания
все обычные определения столбцов доступны как при создании обычной таблице. Пример:
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
нашел ответ самостоятельно. Моя проблема заключалась в том, что я использую две временные таблицы для соединения и создаю вторую из первой. Но индекс не был скопирован во время создания...
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;
... решить мою проблему.
поздравления...
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;