CREATE TABLE AS vs SELECT INTO

Eva*_*oll 20 postgresql ctas

PostgreSQL 支持CREATE TABLE ASSELECT INTO我什么时候同时使用两者?

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

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

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

进而。

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

SELECT INTO创建一个新表并用查询计算的数据填充它。数据不会返回给客户端,因为它是普通的SELECT. 新表的列的名称和数据类型与SELECT.

Eva*_*oll 20

没有说明,总是CREATE TABLE AS无一例外地使用。在每个底部的NOTES下,这被清除了,

注意事项SELECT INTO,

CREATE TABLE AS在功能上类似于SELECT INTO. CREATE TABLE AS是推荐的语法,因为这种形式SELECT INTO在 ECPG 或 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 章)中的用法。PostgreSQLSELECT INTO用于表示表创建的用法是历史性的。最好CREATE TABLE AS在新代码中用于此目的。

所以我们有,

  1. PostgreSQL 认为这很令人困惑,因为SELECT INTO上下文中的其他内容仅在 PL/pgSQL 和 ECPG 中可用。
  2. CREATE TABLE支持更多功能(我假设他们指的是WITH OIDS, 和TABLESPACE, IF NOT EXISTS)。
  3. SELECT INTO 表创建是“弃用”。

附带说明一下,带有 CTECTAS的语法可能看起来有点奇怪。,也SELECT INTO 可能是对QUEL 的RETRIEVE INTO某种控制。QUEL 是 SQL 的前身,PostgreSQL (INGRES) 的前身使用了它。