4

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

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

CREATE TEMPORARY TABLE t (test INT);

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

CREATE TEMPORARY TABLE t2 LIKE t;

但这给出了一个错误:

CREATE TEMPORARY TABLE t LIKE t;

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

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

4

2 回答 2

7

既然我了解了您要做什么,这是我可以做的最接近您想做的事情:

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;
于 2013-08-26T03:00:50.277 回答
-1

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

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”,因为它不会影响任何其他交易(将有明确定义的“之前”和“之后”)。

于 2013-08-26T01:51:42.420 回答