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