CREATE TABLE AS与SELECT INTO


16

PostgreSQL支持CREATE TABLE ASSELECT INTO何时同时使用两者?

CREATE TABLE AS -根据查询结果定义新表

CREATE TABLE AS创建一个表,并用SELECT命令计算的数据填充该表。表列具有与的输出列关联的名称和数据类型SELECT(除非您可以通过提供新列名称的显式列表来覆盖列名称)。

CREATE TABLE AS与创建视图有些相似,但实际上是完全不同的:它创建一个新表并仅对查询进行一次评估以最初填充新表。新表将不会跟踪对查询源表的后续更改。相反,SELECT无论何时查询,视图都会重新评估其定义语句。

接着。

SELECT INTO -根据查询结果定义新表

SELECT INTO创建一个新表并将其填充查询所计算的数据。数据不会像常规一样返回给客户端SELECT。新表的列具有与的输出列关联的名称和数据类型SELECT

Answers:


15

如果没有解释,请务必CREATE TABLE AS毫无例外地使用。在“ 注释 ”下每个注释的底部将其清除,

的注释SELECT INTO

CREATE TABLE AS在功能上类似于SELECT INTOCREATE TABLE AS是推荐的语法,因为SELECT INTOECPG或PL / pgSQL中没有此格式,因为它们对INTO子句的解释不同。此外,CREATE TABLE AS还提供了所提供功能的超集SELECT INTO

的注释CREATE TABLE AS

该命令在功能上与相似SELECT INTO,但是它是首选的,因为它不太可能与SELECT INTO语法的其他用法混淆。此外,CREATE TABLE AS还提供了所提供功能的超集SELECT INTO

同样在其文档的“ 兼容性”部分中SELECT INTO

SQL标准用于SELECT INTO将选择值表示为宿主程序的标量变量,而不是创建新表。这确实是ECPG(请参阅第34章)和PL / pgSQL(请参阅第41章)中的用法。PostgreSQL SELECT INTO代表表创建的用法是历史性的。最好CREATE TABLE AS为此在新代码中使用。

所以我们有

  1. PostgreSQL认为这很混乱,因为SELECT INTO在PL / pgSQL和ECPG中仅提供上下文中的其他内容。
  2. CREATE TABLE支持更多的功能(我假设他们指的是WITH OIDS,和TABLESPACEIF NOT EXISTS)。
  3. SELECT INTO 用于表创建的“不建议使用”。

附带说明一下,带有CTECTAS的语法可能看起来有些怪异。,也SELECT INTO 可能是对QUEL的RETRIEVE INTO保留。QUEL是SQL的前身,是PostgreSQL(INGRES)的前身。


1

我注意到接受的答案中还有另一件事。使用 CREATE TABLE AS保留似乎被忽略的每列的nullable属性SELECT INTO

仅在此基础上,我建议CREATE TABLE AS。这两种语句的一个常见用例是将长时间运行的查询中的数据加载到表中,而在查询期间不锁定该表。您可以使用上述命令之一创建一个临时表,将长时间运行的查询结果放入其中,然后将这些结果插入原始表中。在临时表中保留nullable属性可减少第二次插入失败的机会。

在PG 11上进行了测试,因此自从回答了这个问题以来,也许是一个更新的功能。


长时间运行的查询不会锁定任何表。因此,出于这个原因使用CTAS的动机是徒劳的
a_horse_with_no_name 19'Aug
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.