创建一个类似于普通表的临时表。

4
我希望创建一个临时表,该表将暂时影子化一个真实的表,并且与真实表具有相同的名称和结构。
所有特性都能够独立正常工作。这将创建一个暂时性的表格,隐藏原有的表格,直到暂时性表格再次被删除:
CREATE TEMPORARY TABLE t (test INT);

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

CREATE TEMPORARY TABLE t2 LIKE t;

但是这会出现一个错误:
CREATE TEMPORARY TABLE t LIKE t;

1066 - 非唯一表/别名: 't'

该表是一个持久性缓存,保存了从原始表中获取需要花费太长时间的分组数据。这些数据用于生成报告。有时,对于部分报告,我想从数据子集中重新创建缓存。临时表非常适合此操作,因为我可以使用新鲜数据覆盖原始缓存,运行报告函数并在连接结束时自动删除它,而所有其他进程都可以愉快地使用真实的持久性表。


你是什么意思说“暂时影射一个真实的表格”? - Gordon Linoff
就像我说的那样:它“在临时表被再次删除之前隐藏了先前的表”。 - AndreKR
改进的答案 @AndreKR - Ezequiel Muns
2个回答

8

现在我理解你想要做什么了,下面是我能够提供的最接近你需求的翻译:

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;

我在问题中添加了一个解释。 - AndreKR
请注意,我在MySQL v8.0中尝试过,但它不会复制选项(如AUTOINCREMENT,NULL等)。 - ESL

-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 应该是“瞬时的”,也就是说它不会影响任何其他事务(它将有一个明确定义的“之前”和“之后”)。


这张表是 MyISAM 类型的。我尝试着使用 CREATE TEMPORARY TABLE t2 LIKE t; RENAME TABLE t2 TO t; 语句,但系统提示我 Table 't' already exists,说明该表已经存在。如果现在重命名原始表,那么所有查询 t 的操作都将中断,直到临时表被创建完成。 - AndreKR
@AndreKR . . . 重命名现有表应该是一个非常快的操作。我认为在此过程中您也可以锁定该表(尽管我在重命名期间没有锁定过表)。 - Gordon Linoff
锁不是会“跟随”重命名吗?比如当我锁定 t 然后执行 RENAME TABLE t TO t2,我认为 t2 被锁住了而不是“任何以后被称为 t 的表”。 - AndreKR
我不明白你修改后的解决方案的重点所在。我的问题是关于一个临时表,它是本地连接的。我认为视图将会被改变,对于所有连接的客户端来说都是完全不同的事情。 - AndreKR
1
@AndrewKR 原始问题中没有提到它只是局限于连接。也许如果您解释一下您想要解决什么问题,可能会有更好的解决方案出现。 - Dijkgraaf
我在问题中添加了一个解释。 - AndreKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接