创建一个临时表LIKE常规表

And*_*eKR 2 mysql sql

我想创建一个临时表,它将暂时隐藏真实的表,并具有与真实表相同的名称和结构.

独立所有功能都按预期工作.这将创建一个临时表,该表隐藏上一个表,直到再次删除临时表为止:

CREATE TEMPORARY TABLE t (test INT);
Run Code Online (Sandbox Code Playgroud)

这将创建一个与原始结构具有相同结构(但名称不同)的临时表:

CREATE TEMPORARY TABLE t2 LIKE t;
Run Code Online (Sandbox Code Playgroud)

但是这给出了一个错误:

CREATE TEMPORARY TABLE t LIKE t;
Run Code Online (Sandbox Code Playgroud)

1066 - 不唯一的表/别名:'t'

该表是一个持久高速缓存,用于保存从原始表中获取时需要太长时间的分组数据.此数据用于生成报告.有时,对于部分报告,我想从数据的子集中新创建缓存.临时表是理想的,因为我可以用新数据覆盖原始缓存,在其上运行报告功能,并在连接结束时自动删除,而所有其他进程可以愉快地使用真正的持久表.

Eze*_*uns 6

既然我明白你要做什么,这是我能做到你想做的最接近的事情:

CREATE TEMPORARY TABLE t AS SELECT * FROM t LIMIT 0;
Run Code Online (Sandbox Code Playgroud)

这将创建一个临时表,它将使用几乎相同的模式"隐藏"原始文件.不带来的关键事项是任何键定义,这些键上的auto_increment属性,索引和默认值.


原始答案:您可以在工作时重命名表格.理解在这个版本中,当脚本运行时,所有其他连接都可以看到您的阴影表:

CREATE TABLE target_temp LIKE target;
Run Code Online (Sandbox Code Playgroud)

然后原子地重命名这两个表,因此"临时"表替换了真正的表:

RENAME TABLE target TO target_old, target_temp TO target;
Run Code Online (Sandbox Code Playgroud)

做你的事......

然后,撤消:

RENAME TABLE target TO target_temp, target_old TO target;
DROP TABLE target_temp;
Run Code Online (Sandbox Code Playgroud)