我想创建一个临时表,它将临时隐藏真实表,并且具有与真实表相同的名称和结构。
独立地所有功能都按预期工作。这将创建一个临时表,该表隐藏上一个表,直到再次删除临时表:
CREATE TEMPORARY TABLE t (test INT);
这将创建一个与原始结构具有相同结构(但名称不同)的临时表:
CREATE TEMPORARY TABLE t2 LIKE t;
但这会产生错误:
CREATE TEMPORARY TABLE t LIKE t;
1066 - 不唯一的表/别名:'t'
该表是一个持久高速缓存,用于保存从原始表中获取时需要太长时间的分组数据。此数据用于生成报告。有时,对于部分报告,我想从数据的子集中新创建缓存。临时表是理想的,因为我可以用新数据覆盖原始缓存,在其上运行报告功能,并在连接结束时自动删除,而所有其他进程可以愉快地使用真正的持久表。
答案 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
应该是“瞬时的”,因为它不会影响任何其他交易(会有明确定义的“之前”和“之后”)。