创建一个临时表LIKE一个常规表



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

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

CREATE TEMPORARY TABLE t (test INT);

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

CREATE TEMPORARY TABLE t2 LIKE t;

但这给出了一个错误:

CREATE TEMPORARY TABLE t LIKE t;

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

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

现在我明白了你想做什么,这是我最接近做你想做的事情:

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;

我不完全理解你想做什么。但我认为你可以先重命名,然后创建,再重命名:

rename table t to t_hide;
create table t like t_hide;
. . .
drop table t;
rename table t_hide t;

我不认为有一种内在的方法可以做到这一点。你可以打开一个交易。对CCD_ 1进行更改,然后回滚事务以阻止更改通过。这可能也是你想要的。

编辑:

另一种解决方案是将原始表转换为一个名为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应该是"即时的",因为它不会影响任何其他事务(它将有一个明确定义的"之前"one_answers"之后")。

最新更新