创建一个临时表LIKE常规表

时间:2013-08-26 01:44:59

标签: mysql sql

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

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

CREATE TEMPORARY TABLE t (test INT);

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

CREATE TEMPORARY TABLE t2 LIKE t;

但这会产生错误:

CREATE TEMPORARY TABLE t LIKE t;
  

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

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

2 个答案:

答案 0 :(得分:6)

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

CREATE TEMPORARY TABLE t AS SELECT * FROM t LIMIT 0;

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


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

CREATE TABLE target_temp LIKE target;

然后以原子方式重命名这两个表,因此“临时”表替换了真正的表:

RENAME TABLE target TO target_old, target_temp TO target;

做你的事......

然后,撤消:

RENAME TABLE target TO target_temp, target_old TO target;
DROP TABLE target_temp;

答案 1 :(得分:0)

我不完全明白你想做什么。但我认为你可以重命名,然后创建和另一个重命名:

rename table t to t_hide;

create table t like t_hide;

. . .

drop table t;

rename table t_hide t;

我认为没有内置的方法可以做到这一点。您可以打开一个交易。对t进行更改,然后回滚事务以防止更改通过。那可能也是你想要的。

编辑:

另一种解决方案是将原始表转换为名为t的视图。所以,有一次你会这样做:

rename table t to t_real;

create view t as select * from t_real;

然后你可以做类似的事情:

create table t_fake like t_real;

alter view t as select * from t_fake;

alter view应该是“瞬时的”,因为它不会影响任何其他交易(会有明确定义的“之前”和“之后”)。