CREATE TABLE AS

CREATE TABLE AS — define uma nova tabela a partir dos resultados de uma consulta

Sinopse

CREATE tipo_de_tabela TABLE [ IF NOT EXISTS ] nome_da_tabela
    [ (nome_da_coluna [, ...] ) ]
    [ USING método ]
    [ WITH ( parâmetro_de_armazenamento [= valor] [, ... ] ) | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE nome_do_espaço_de_tabelas ]
    AS consulta
    [ WITH [ NO ] DATA ]

onde tipo_de_tabela pode ser:

[ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ]

Descrição

O comando CREATE TABLE AS define uma tabela e a preenche com dados computados por um comando SELECT. As colunas da tabela têm os nomes e tipos de dados associados às colunas de saída do SELECT (mas é possível mudar os nomes das colunas fornecendo uma lista explícita de novos nomes de colunas).

O comando CREATE TABLE AS tem alguma semelhança com a definição de uma visão, mas é bem diferente: ele define uma tabela e executa a consulta apenas uma vez para preencher a nova tabela inicialmente. A nova tabela não irá rastrear as alterações posteriores nas tabelas de origem da consulta. Por outro lado, uma visão executa sua definição do SELECT sempre que é consultada.

O comando CREATE TABLE AS requer o privilégio CREATE no esquema usado para a tabela.

Parâmetros

GLOBAL ou LOCAL

Ignorado, só para compatibilidade. O uso dessas palavras-chave está em obsolescência; veja CREATE TABLE para obter detalhes.

TEMPORARY ou TEMP

Se especificado, a tabela é definida como uma tabela temporária. Veja CREATE TABLE para obter detalhes.

UNLOGGED

Se especificado, a tabela é definida como uma tabela sem registro de transações (unlogged). Veja CREATE TABLE para obter detalhes.

IF NOT EXISTS

Não produz um erro se já existir uma relação com o mesmo nome; simplesmente emite uma notificação e deixa a tabela inalterada.

nome_da_tabela

O nome (opcionalmente qualificado pelo esquema) da tabela a ser definida.

nome_da_coluna

O nome da coluna na nova tabela. Se não forem fornecidos nomes para as colunas, estes serão obtidos a partir dos nomes das colunas de saída da consulta.

USING método

Esta cláusula opcional especifica o método de acesso à tabela a ser usado para armazenar o conteúdo da nova tabela; o método precisa ser um método de acesso do tipo TABLE. Veja Definição da interface do método de acesso à tabela para obter mais informações. Se esta opção não for especificada, será escolhido o método de acesso à tabela padrão para a nova tabela. Veja default_table_access_method para obter mais informações.

WITH ( parâmetro_de_armazenamento [= valor] [, ... ] )

Esta cláusula especifica parâmetros opcionais de armazenamento para a nova tabela; veja Parâmetros de armazenamento na documentação de CREATE TABLE para obter mais informações. Para compatibilidade com versões anteriores, a cláusula WITH para uma tabela também pode incluir OIDS=FALSE para especificar que as linhas da nova tabela não devem conter OIDs (identificadores de objeto). OIDS=TRUE não tem mais suporte.

WITHOUT OIDS

Esta é uma sintaxe compatível com as versões anteriores para definir uma tabela WITHOUT OIDS. A definição de uma tabela WITH OIDS não tem mais suporte.

ON COMMIT

O comportamento das tabelas temporárias no final do bloco de transação pode ser controlado usando ON COMMIT. As três opções são:

PRESERVE ROWS

Nenhuma ação especial é tomada no final das transações. Este é o comportamento padrão.

DELETE ROWS

Todas as linhas da tabela temporária são excluídas ao final de cada bloco de transação. Essencialmente, é feito um TRUNCATE automático a cada efetivação (commit).

DROP

A tabela temporária será removida no final do bloco de transação corrente.

TABLESPACE nome_do_espaço_de_tabelas

O nome_do_espaço_de_tabelas é o nome do espaço de tabelas no qual a nova tabela será definida. Se não for especificado é consultado default_tablespace, ou temp_tablespaces se a tabela for temporária.

consulta

Um comando SELECT, Comando TABLE ou VALUES, ou um comando EXECUTE que executa uma consulta SELECT, TABLE ou VALUES preparada.

WITH [ NO ] DATA

Esta cláusula especifica se os dados produzidos pela consulta devem ou não ser copiados para a nova tabela. Com NO, apenas a estrutura da tabela é copiada. O padrão é copiar os dados.

Notas

Este comando é funcionalmente semelhante a SELECT INTO, mas é preferível, porque é menos provável que seja confundido com outros usos da sintaxe SELECT INTO. Além disso, CREATE TABLE AS oferece mais funcionalidades que as oferecidas por SELECT INTO.

Exemplos

Definição da tabela films_recent consistindo apenas em filmes recentes da tabela films:

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2022-01-01';

Para copiar a tabela toda, também pode ser usada a forma abreviada empregando o comando TABLE:

CREATE TABLE films2 AS
  TABLE films;

Definição da tabela temporária films_recent, consistindo apenas em entradas recentes da tabela films, usando uma instrução preparada. A nova tabela será removida no COMMIT:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent ON COMMIT DROP AS
  EXECUTE recentfilms('2022-01-01');

Exemplo 84. Exemplo do tradutor

Criação de tabela usando VALUES

Neste exemplo é criada a tabela temporária classes_endereços_ip, contendo o intervalo das classes de endereços de IP, e preenchida usando VALUES.

=> CREATE TEMPORARY TABLE classes_endereços_ip
(classe, endereco_inicial, endereco_final)
AS VALUES
('A',   '0.0.0.1'::inet, '126.255.255.255'::inet),
('B', '128.0.0.0', '191.255.255.255'),
('C', '192.0.0.0', '223.255.255.255'),
('D', '224.0.0.0', '239.255.255.255'),
('E', '240.0.0.0', '255.255.255.254');
SELECT 5
=> SELECT * FROM classes_endereços_ip;
 classe | endereco_inicial | endereco_final
--------+------------------+-----------------
 A      | 0.0.0.1          | 126.255.255.255
 B      | 128.0.0.0        | 191.255.255.255
 C      | 192.0.0.0        | 223.255.255.255
 D      | 224.0.0.0        | 239.255.255.255
 E      | 240.0.0.0        | 255.255.255.254
(5 linhas)
=> \d classes_endereços_ip;
           Tabela "pg_temp_3.classes_endereços_ip"
      Coluna      | Tipo | Ordenação | Pode ser nulo | Padrão
------------------+------+-----------+---------------+--------
 classe           | text |           |               |
 endereco_inicial | inet |           |               |
 endereco_final   | inet |           |               |

Conformidade

O comando CREATE TABLE AS está em conformidade com o padrão SQL. As extensões fora do padrão são as seguintes:

  • O padrão requer parênteses ao redor da cláusula de subconsulta; no PostgreSQL, estes parênteses são opcionais.

  • No padrão, a cláusula WITH [ NO ] DATA é requerida; no PostgreSQL é opcional.

  • O PostgreSQL trata tabelas temporárias de uma forma bem diferente do padrão; veja CREATE TABLE para obter detalhes.

  • A cláusula WITH é uma extensão do PostgreSQL; parâmetros de armazenamento não fazem parte do padrão.

  • O conceito do PostgreSQL de espaço de tabelas não faz parte do padrão. Portanto, a cláusula TABLESPACE é uma extensão.

Veja também

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES, pg_tables