【发布时间】:2024-01-08 11:54:01
【问题描述】:
是否可以在不使用 create table 语句并指定每个列类型的情况下从 select 语句创建临时(仅限会话)表?我知道派生表可以做到这一点,但那些是超级临时的(仅限语句),我想重复使用。
如果我不必编写创建表命令并保持列列表和类型列表匹配,这将节省时间。
【问题讨论】:
标签: mysql select temp-tables create-table derived-table
是否可以在不使用 create table 语句并指定每个列类型的情况下从 select 语句创建临时(仅限会话)表?我知道派生表可以做到这一点,但那些是超级临时的(仅限语句),我想重复使用。
如果我不必编写创建表命令并保持列列表和类型列表匹配,这将节省时间。
【问题讨论】:
标签: mysql select temp-tables create-table derived-table
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)
来自http://dev.mysql.com/doc/refman/5.7/en/create-table.html的手册
您可以在创建表时使用 TEMPORARY 关键字。 TEMPORARY 表仅对当前会话可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名称,而不会相互冲突或与现有的同名非临时表冲突。 (在删除临时表之前,现有表是隐藏的。)要创建临时表,您必须具有 CREATE TEMPORARY TABLES 权限。
【讨论】:
temporary 所以create temporary table mytable as select ...。
create table t as select ... limit 0; alter table t engine=memory; insert into t select ...。或者,也许您可以更改“新表的默认引擎”。我想这可以在会话级变量中完成。更好的是,使用右上角的按钮。
CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1如果你不想复制数据,只是结构
除了 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
【讨论】:
transactions,仅支持表级锁定...阅读更多:dba.stackexchange.com/questions/1811/…
使用这个语法:
CREATE TEMPORARY TABLE t1 (select * from t2);
【讨论】:
引擎必须在选择之前:
CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY
as (select * from table1)
【讨论】:
当表包含BLOB/TEXT 列时,不支持ENGINE=MEMORY
【讨论】:
据我了解,如果您在 phpMyAdmin 之类的东西中使用 SELECT 语句,它将在临时表上工作,但在 SELECT 之后,临时表将消失。这意味着首先准确设置您想要对其执行的操作,并且在您更改数据的“操作”语句(删除、更新)完成之前不要查看任何结果。
【讨论】: