创建具有与永久表相同的列和类型的临时表的最佳方法


72

我需要创建一个具有与永久表相同的列和类型的临时表。最好的方法是什么?(永久表有超过100列)

通常我创建这样的表。

DECLARE  #TT TABLE(              
  member_id INT,    
  reason varchar(1),    
  record_status varchar(1) ,    
  record_type varchar(1)    
 ) 

但是,有什么方法可以不提及列名和类型,而要提及具有所需列的另一个表的名称?


1
多数民众赞成不是临时表,多数民众赞成在一个表变量。
森·冈萨雷斯

@ nathangonzalez-是的,它是..更新问题..我相信答案都适用于这两个问题..如果不能,请多指教
Ananth 2012年

@Ananth,必须显式声明表变量,因此它最初的方式与获得的方式差不多。临时表可以使用创建select into声明,这是更长远的保障和更少的耗时比handtyping的DDL
内森·冈萨雷斯

1
@fyr,我看不到这是那个问题的重复。他甚至没有select into在他的问题中提及,而且大多数答案都是无关紧要的。
森·冈萨雷斯

@fyr ..我不需要数据..只需要一个具有相同模式的表
Ananth

Answers:


138
select top 0 *
into #mytemptable
from myrealtable

1
+1表示“其中0 = 1”,但解决方案更快。
约阿希姆·伊萨克森

1
@JoachimIsaksson-只是出于兴趣,您如何衡量?我自己进行了一些粗略的测试,发现两者之间没有区别。
Mikael Eriksson'2

1
@MikaelEriksson并没有做更深入的分析,但是我看到了一个细微的差别,运行一个旧的SQL Server并且top 0似乎根本无法访问表或索引,而0 = 1似乎可以访问主键索引。虽然不确定时差有多大,但没有可供测试的庞大表。同样,这听起来很依赖于实现,因此在新版本中可能有所不同。
Joachim Isaksson '02

1
@MikaelEriksson可以确认2008R2对于大型表(50M +行,仅PK)似乎(在时间上)花费相同的时间。我不是拥有任何跟踪许可权的数据库,因此无法查看其计划是否相同。
Joachim Isaksson

1
注意:如果myrealtable有任何计算列,它们将作为实列插入到临时表中,这通常是不希望的。
史蒂夫·吉迪

14

我意识到这个问题非常古老,但是对于任何寻求特定于PostgreSQL解决方案的人来说,它是:

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0;

注意,临时表将被放入pg_temp_3之类的模式中。

这将创建一个临时表,该表将具有所有列(不包含索引)并且不包含数据,但是根据您的需要,您可能需要删除主键:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key;

如果原始表中没有任何数据开始,则可以省略“ LIMIT 0”。


9

这是特定于MySQL的答案,不确定是否在其他地方起作用-

您可以使用以下方法创建具有相同列定义的空表:

CREATE TEMPORARY TABLE temp_foo LIKE foo;

您可以使用以下命令创建现有表的填充副本:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo;

以下是postgres的作品;不幸的是,不同的RDBMS在这里看起来不太一致:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo;

8

最好的一个...

select top 0 * into #temptable from mytable

注意:这将创建一个空的temp副本,但不会创建主键


这也将插入所有数据。
森·冈萨雷斯

@nathangonzalez:我尝试过,该解决方案运行良好。.只是创建了该表而没有任何数据
Ananth 2012年

我一直对此和自动递增ID有问题。当插入临时表时,将重置ID。
Ryan The Leach


0

将临时表结构克隆到SQL Server中的新物理表

在此处输入图片说明

我们将了解如何在SQL Server中将临时表结构克隆到新的物理表中。这适用于Azure SQL数据库和内部部署。

演示SQL脚本

IF OBJECT_ID('TempDB..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

SELECT 1 AS ID,'Arul' AS Names
INTO
#TempTable;

SELECT * FROM #TempTable;

方法1

SELECT * INTO TempTable1 FROM #TempTable WHERE 1=0;

EXEC SP_HELP TempTable1;

在此处输入图片说明

方法2

SELECT TOP 0 * INTO TempTable1 FROM #TempTable;

EXEC SP_HELP TempTable1;

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.