PostgreSQL suporta CREATE TABLE AS
e SELECT INTO
quando eu uso ambos?
CREATE TABLE AS
-- define uma nova tabela a partir dos resultados de uma consulta
CREATE TABLE AS
cria uma tabela e a preenche com dados calculados por umSELECT
comando. As colunas da tabela têm os nomes e tipos de dados associados às colunas de saída doSELECT
(exceto que você pode substituir os nomes das colunas fornecendo uma lista explícita de novos nomes de colunas).
CREATE TABLE AS
tem alguma semelhança com a criação de uma visão, mas é bem diferente: cria uma nova tabela e avalia a consulta apenas uma vez para preencher a nova tabela inicialmente. A nova tabela não rastreará alterações subsequentes nas tabelas de origem da consulta. Em contraste, uma visão reavalia suaSELECT
declaração de definição sempre que é consultada.
E depois.
SELECT INTO
-- define uma nova tabela a partir dos resultados de uma consulta
SELECT INTO
cria uma nova tabela e a preenche com dados calculados por uma consulta. Os dados não são devolvidos ao cliente, como ocorre com um arquivoSELECT
. As colunas da nova tabela têm os nomes e tipos de dados associados às colunas de saída do arquivoSELECT
.
Sem a explicação, use sempre
CREATE TABLE AS
sem exceção. Na parte inferior de cada um em NOTAS , isso é esclarecido,Notas para
SELECT INTO
,Notas para
CREATE TABLE AS
,Também na seção Compatibilidade dos documentos
SELECT INTO
vai ainda mais longe,Então nós temos,
SELECT INTO
faz outras coisas em contextos disponíveis apenas em PL/pgSQL e ECPG.CREATE TABLE
suporta mais funcionalidade (suponho que eles estejam se referindo aWITH OIDS
, eTABLESPACE
,IF NOT EXISTS
).SELECT INTO
para criação de tabela é "obsoleto".Como observação, a sintaxe de um CTAS com um CTE pode parecer um pouco estranha. , e também
SELECT INTO
pode ser algum tipo de controle sobre QUEL'sRETRIEVE INTO
. QUEL foi o predecessor do SQL, que o antecessor do PostgreSQL (INGRES) usava.Há outra coisa que notei que está faltando na resposta aceita. Usar
CREATE TABLE AS
preserva o atributo anulável de cada coluna que parece ser ignorado porSELECT INTO
.Apenas com base nisso, eu recomendo
CREATE TABLE AS
. Um caso de uso comum para ambas as instruções é carregar dados de uma consulta de execução longa em uma tabela sem bloquear essa tabela durante a consulta. Você cria uma tabela temporária usando um dos comandos acima, coloca os resultados da consulta de execução longa e, em seguida, insere esses resultados na tabela original. Preservar o atributo anulável em sua tabela temporária reduz as chances de sua segunda inserção falhar.Testado no PG 11, talvez um recurso mais recente desde que essa pergunta foi respondida.