PostgreSQL 支持CREATE TABLE AS
,SELECT INTO
我什么时候同时使用?
CREATE TABLE AS
-- 根据查询结果定义一个新表
CREATE TABLE AS
SELECT
创建一个表并用命令计算的数据填充它。表列具有与输出列相关联的名称和数据类型SELECT
(除了您可以通过提供新列名的显式列表来覆盖列名)。
CREATE TABLE AS
与创建视图有一些相似之处,但实际上完全不同:它创建一个新表并只评估一次查询以填充新表。新表不会跟踪查询的源表的后续更改。相反,SELECT
每当查询视图时,它都会重新评估其定义语句。
接着。
SELECT INTO
-- 根据查询结果定义一个新表
SELECT INTO
创建一个新表并用查询计算的数据填充它。数据不会像普通的SELECT
. 新表的列的名称和数据类型与SELECT
.
没有解释,总是
CREATE TABLE AS
毫无例外地使用。在每个注释的底部,这被清除了,的注释
SELECT INTO
,的注释
CREATE TABLE AS
,同样在它的文档的兼容性部分
SELECT INTO
更进一步,所以我们有,
SELECT INTO
上下文中的其他内容仅在 PL/pgSQL 和 ECPG 中可用。CREATE TABLE
支持更多功能(我假设他们指的是WITH OIDS
, 和TABLESPACE
,IF NOT EXISTS
)。SELECT INTO
表创建是“弃用”。附带说明一下,带有 CTE 的 CTAS 的语法可能看起来有点奇怪。, 也
SELECT INTO
可能是对QUEL 的RETRIEVE INTO
某种保留。QUEL 是 SQL 的前身,PostgreSQL (INGRES) 使用的前身。我注意到接受的答案中缺少另一件事。使用
CREATE TABLE AS
保留了似乎被忽略的每列的可为空属性SELECT INTO
。仅在此基础上,我建议
CREATE TABLE AS
。这两种语句的一个常见用例是将长时间运行的查询中的数据加载到表中,而不会在查询期间锁定该表。您使用上述命令之一创建一个临时表,将长时间运行的查询结果放入其中,然后将这些结果插入到原始表中。在临时表中保留可为空的属性可以减少第二次插入失败的机会。在 PG 11 上对此进行了测试,因此可能是自回答此问题以来的新功能。