Я долго боролся с правильным синтаксисом для CREATE TEMPORARY TABLE 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;
источник
PRIMARY KEY
всегда индексируется.