CREATE TABLE AS — define uma nova tabela a partir dos resultados de uma consulta
CREATEtipo_de_tabelaTABLE [ IF NOT EXISTS ]nome_da_tabela[ (nome_da_coluna[, ...] ) ] [ USINGmétodo] [ WITH (parâmetro_de_armazenamento[=valor] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEnome_do_espaço_de_tabelas] ASconsulta[ WITH [ NO ] DATA ] ondetipo_de_tabelapode ser: [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ]
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.
GLOBAL ou LOCALIgnorado, só para compatibilidade. O uso dessas palavras-chave está em obsolescência; veja CREATE TABLE para obter detalhes.
TEMPORARY ou TEMPSe especificado, a tabela é definida como uma tabela temporária. Veja CREATE TABLE para obter detalhes.
UNLOGGEDSe especificado, a tabela é definida como uma tabela sem registro de transações (unlogged). Veja CREATE TABLE para obter detalhes.
IF NOT EXISTSNã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_tabelaO nome (opcionalmente qualificado pelo esquema) da tabela a ser definida.
nome_da_colunaO 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 ROWSNenhuma ação especial é tomada no final das transações. Este é o comportamento padrão.
DELETE ROWSTodas 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).
DROPA 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.
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.
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 | | |
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.