Створіть тимчасову таблицю в операторі SELECT без окремої CREATE TABLE


494

Чи можливо створити тимчасову таблицю (лише для сеансу) з вибору оператора без використання оператора створення таблиці та вказівки кожного типу стовпців? Я знаю, що похідні таблиці здатні на це, але вони є тимчасовими (лише для виписки), і я хочу їх повторно використовувати.

Це би заощадило час, якби мені не довелося записувати команду create table та підтримувати відповідність списку стовпців та списку типів.

Відповіді:


789
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

З посібника, знайденого на веб- сайті http://dev.mysql.com/doc/refman/5.7/uk/create-table.html

Ви можете використовувати ключове слово TEMPORARY під час створення таблиці. Таблиця тимчасових розмірів відображається лише для поточного сеансу і автоматично випадає, коли сеанс закритий. Це означає, що два різні сеанси можуть використовувати одне і те ж ім’я тимчасової таблиці, не конфліктуючи один з одним або з існуючою не-ТЕМПОРАРІЙНОю таблицею з тим же ім’ям. (Існуюча таблиця прихована до тих пір, поки тимчасова таблиця не буде скинута.) Для створення тимчасових таблиць необхідно мати привілей CREATE TEMPORARY TABLES.


8
Ідеально! Стовпчики з оптимальною максимальною довжиною і все! Я додав слово temporaryтак create temporary table mytable as select ....
Брайан Поле

5
@ Imperium2335, Може бути , ви повинні спробувати наступне: create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Або, можливо, ви можете змінити "двигун нових таблиць за замовчуванням". Я думаю, це можна зробити за допомогою змінної рівня сеансу. А ще краще скористатися кнопкою Задати питання вгорі праворуч.
Брайан Філд

10
Він не вимагає знати про назви та типи стовпців, що було причиною того, що запитуючий бажав уникати використання Створити таблицю.
psparrow

30
ви можете використовувати його так, CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1якщо ви не хочете копіювати дані, просто структуруйте
dzona

1
що ви маєте на увазі під сеансом?
Саурабх Чандра Патель

137

На додаток до відповіді psparrow, якщо вам потрібно додати індекс до вашої тимчасової таблиці, виконайте:

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

Він також працює з PRIMARY KEY


3
Чи може Engine = пам'ять використовуватись і з таким синтаксисом?
DarkSide

6
@DarkSide Так ENGINE = ПАМ'ЯТНЕ також можна використовувати. Дивіться наступний приклад: blog.cnizz.com/2010/11/24/…
RafaSashi

1
чим відрізняється MyISAM від двигуна пам'яті? які переваги пам’яті?
yeahman



39

ENGINE=MEMORYне підтримується, коли таблиця містить BLOB/ TEXTстовпці


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