CREATE TABLE

CREATE TABLE — define uma nova tabela

Sinopse

CREATE tipo_de_tabela TABLE [ IF NOT EXISTS ] nome_da_tabela ( [
  { nome_da_coluna tipo_de_dados
    [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ]
    [ COMPRESSION método_de_compressão ]
    [ COLLATE ordenação ]
    [ restrição_de_coluna [ ... ] ]
    | restrição_de_tabela
    | LIKE tabela_de_origem [ opção_do_LIKE ... ]
  }
  [, ... ]
] )
[ INHERITS ( tabela_mãe [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { nome_da_coluna | ( expressão ) }
  [ COLLATE ordenação ]
  [ classe_de_operador ]
  [, ... ] )
]
[ 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 ]

CREATE tipo_de_tabela TABLE [ IF NOT EXISTS ] nome_da_tabela
  OF nome_do_tipo_de_dados [ (
  { nome_da_coluna [ WITH OPTIONS ] [ restrição_de_coluna [ ... ] ] |
    restrição_de_tabela
  }
  [, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { nome_da_coluna | ( expressão ) }
  [ COLLATE ordenação ]
  [ classe_de_operador ]
  [, ... ] )
]
[ 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 ]

CREATE tipo_de_tabela TABLE [ IF NOT EXISTS ] nome_da_tabela
  PARTITION OF tabela_mãe [ (
  { nome_da_coluna [ WITH OPTIONS ] [ restrição_de_coluna [ ... ] ] |
    restrição_de_tabela
  }
  [, ... ] ) ]
{ FOR VALUES especificação_de_limite_de_partição | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { nome_da_coluna | ( expressão ) }
  [ COLLATE ordenação ]
  [ classe_de_operador ]
  [, ... ] )
]
[ 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 ]

onde tipo_de_tabela pode ser:

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

e restrição_de_coluna é:

[ CONSTRAINT nome_da_restrição ]
{ NOT NULL [ NO INHERIT ]  |
  NULL |
  CHECK ( expressão ) [ NO INHERIT ] |
  DEFAULT expressão_padrão |
  GENERATED ALWAYS AS ( expressão_de_geração ) [ STORED | VIRTUAL ] |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( opções_da_sequência ) ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] parâmetros_de_índice |
  PRIMARY KEY parâmetros_de_índice |
  REFERENCES tabela_referenciada [ ( coluna_referenciada ) ]
  [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
  [ ON DELETE ação_referencial ]
  [ ON UPDATE ação_referencial ]
}
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
[ ENFORCED | NOT ENFORCED ]

e restrição_de_tabela é:

[ CONSTRAINT nome_da_restrição ]
{ CHECK ( expressão ) [ NO INHERIT ] |
  NOT NULL nome_da_coluna [ NO INHERIT ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] ( nome_da_coluna [, ... ]
      [, nome_da_coluna WITHOUT OVERLAPS ] )
      parâmetros_de_índice |
  PRIMARY KEY ( nome_da_coluna [, ... ] [, nome_da_coluna WITHOUT OVERLAPS ] )
      parâmetros_de_índice |
  EXCLUDE [ USING método_de_índice ] ( elemento_excluído
      WITH operador [, ... ] ) parâmetros_de_índice
      [ WHERE ( predicado ) ] |
  FOREIGN KEY ( nome_da_coluna [, ... ] [,
      PERIOD nome_da_coluna ] )
  REFERENCES tabela_referenciada
      [ ( coluna_referenciada
      [, ... ] [,
      PERIOD coluna_referenciada ] ) ]
  [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
  [ ON DELETE ação_referencial ]
  [ ON UPDATE ação_referencial ]
}
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
[ ENFORCED | NOT ENFORCED ]

e opção_do_LIKE é:

{ INCLUDING | EXCLUDING }
{   COMMENTS
  | COMPRESSION
  | CONSTRAINTS
  | DEFAULTS
  | GENERATED
  | IDENTITY
  | INDEXES
  | STATISTICS
  | STORAGE
  | ALL
}

e especificação_de_limite_de_partição é:

IN ( expressão_de_limite_de_partição [, ...] ) |
FROM ( { expressão_de_limite_de_partição | MINVALUE | MAXVALUE } [, ...] )
  TO ( { expressão_de_limite_de_partição | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS literal_numérico, REMAINDER literal_numérico )

e parâmetros_de_índice nas restrições UNIQUE, PRIMARY KEY e EXCLUDE são:

[ INCLUDE ( nome_da_coluna [, ... ] ) ]
[ WITH ( parâmetro_de_armazenamento [= valor] [, ... ] ) ]
[ USING INDEX TABLESPACE nome_do_espaço_de_tabelas ]

e elemento_excluído em uma restrição EXCLUDE é:

{ nome_da_coluna | ( expressão ) }
  [ COLLATE ordenação ]
  [ classe_de_operador
  [ ( opclass_parameter = valor [, ... ] ) ] ]
  [ ASC | DESC ]
  [ NULLS { FIRST | LAST } ]

e ação_referencial em uma restrição FOREIGN KEY/REFERENCES é:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( nome_da_coluna [, ... ] ) ] |
  SET DEFAULT [ ( nome_da_coluna [, ... ] ) ]
}

Descrição

O comando CREATE TABLE define uma nova tabela, inicialmente vazia, no banco de dados corrente [139]. O dono da tabela será o usuário que executou o comando.

Se for fornecido um nome de esquema (por exemplo, CREATE TABLE meu_esquema.minha_tabela ...), a tabela será criada no esquema especificado. Caso contrário, a tabela será criada no esquema corrente. As tabelas temporárias existem em um esquema especial, portanto, não pode ser fornecido um nome de esquema ao criar uma tabela temporária. O nome da tabela deve ser diferente do nome de qualquer outra relação (tabela, sequência, índice, visão, visão materializada ou tabela estrangeira) no mesmo esquema.

O comando CREATE TABLE também cria, automaticamente, um tipo de dados que representa o tipo composto correspondente a uma linha da tabela. Portanto, as tabelas não podem ter o mesmo nome de nenhum tipo de dados existente no mesmo esquema.

As cláusulas opcionais de restrição especificam restrições (testes) que as linhas novas ou atualizadas devem satisfazer, para que a operação de inserção ou atualização seja bem-sucedida. Uma restrição é um objeto SQL que ajuda a definir o conjunto de valores válidos na tabela de várias maneiras.

Há duas maneiras de definir restrições: restrição de tabela e restrição de coluna. A restrição de coluna é definida como parte da definição da coluna. Uma definição de restrição de tabela não está vinculada a uma coluna específica, podendo abranger mais de uma coluna. Toda restrição de coluna também pode ser escrita como restrição de tabela; restrição de coluna é apenas uma notação conveniente para ser usada quando a restrição afeta apenas uma coluna.

Para poder criar uma tabela, deve-se ter o privilégio USAGE em todos os tipos de dados das colunas, ou no tipo de dados na cláusula OF, respectivamente.

Parâmetros

TEMPORARY ou TEMP #

Se especificado, a tabela é criada como tabela temporária. As tabelas temporárias são excluídas automaticamente no final da sessão ou, opcionalmente, no final da transação corrente (veja ON COMMIT abaixo). O caminho de procura padrão inclui primeiro o esquema temporário, portanto, as tabelas permanentes existentes com nomes idênticos não serão escolhidas para os novos planos enquanto a tabela temporária existir, a menos que sejam referenciadas com nomes qualificados pelo esquema. Quaisquer índices criados em tabela temporária também são automaticamente temporários.

O processo de auto limpeza (Autovacuum) não pode acessar e, portanto, não pode limpar ou analisar, tabelas temporárias. Por este motivo, as operações apropriadas de limpeza e análise devem ser executadas por meio de comandos SQL da sessão. Por exemplo, se uma tabela temporária for usada em consultas complexas, é aconselhável executar ANALYZE na tabela temporária após ela ser preenchida com dados.

Opcionalmente, podem ser escritos GLOBAL ou LOCAL antes de TEMPORARY ou TEMP. No momento, isto não faz diferença no PostgreSQL, estando em obsolescência; veja Conformidade abaixo.

UNLOGGED #

Se especificado, a tabela será criada como uma tabela sem registro de transações (Unlogged). Os dados escritos nas tabelas sem registro de transações não são escritos no arquivo de registro de transações (veja Confiabilidade e o Registro de Escrita Antecipada), o que as torna consideravelmente mais rápidas do que as tabelas comuns. Entretanto, elas não são à prova de falhas: a tabela sem registro de transações é automaticamente truncada após uma falha ou desligamento incorreto. O conteúdo da tabela sem registro de transações também não é replicado para servidores em espera (standby). Quaisquer índices criados em tabela sem registro de transações também são automaticamente sem registro de transações.

Caso esta opção seja especificada, quaisquer sequências criadas juntamente com a tabela sem registro de transações (para colunas de identidade ou seriais) também serão criadas como sem registro de transações.

Esta sintaxe não tem suporte em tabelas particionadas.

IF NOT EXISTS #

Não relata erro se já existir uma relação com o mesmo nome. É emitido um aviso neste caso. Note não haver garantia de que a relação existente seja parecida com a tabela a ser criada.

nome_da_tabela #

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

OF nome_do_tipo_de_dados #

Cria uma tabela tipada, cuja estrutura deriva do tipo de dados composto independente especificado (isto é, um tipo de dados criado usando CREATE TYPE), embora também produza um novo tipo de dados composto. A tabela terá uma dependência do tipo de dados referenciado, significando que ações em cascata de alteração e exclusão neste tipo de dados serão propagadas para a tabela.

Uma tabela tipada sempre tem os mesmos nomes de coluna e tipos de dados que o tipo de dados do qual ela deriva, portanto, não se pode especificar colunas adicionais. Mas o comando CREATE TABLE pode adicionar valores padrão e restrições à tabela, bem como especificar parâmetros de armazenamento.

nome_da_coluna #

O nome da coluna a ser criada na nova tabela.

tipo_de_dados #

O tipo de dados da coluna. Pode incluir especificadores de matriz. Para obter mais informações sobre os tipos de dados com suporte pelo PostgreSQL, veja Tipos de dados.

COLLATE ordenação #

A cláusula COLLATE atribui uma ordenação à coluna (que deve ser de um tipo de dados ordenável). Se não for especificada, será usada a ordenação padrão do tipo de dados da coluna.

STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } #

Esta sintaxe define o modo de armazenamento da coluna. Controla se esta coluna é mantida na tabela principal ou em uma tabela secundária TOAST, e se os dados devem ser comprimidos ou não. PLAIN deve ser usado para valores de comprimento fixo, como números inteiros (integer), armazenados na tabela principal sem compressão. MAIN é para dados armazenados na tabela principal potencialmente compressíveis. EXTERNAL é para dados externos não comprimidos, e EXTENDED é para dados externos comprimidos. Escrever DEFAULT define o modo de armazenamento para o modo padrão do tipo de dados da coluna. EXTENDED é o padrão para a maioria dos tipos de dados permitem armazenamento diferente de PLAIN. O uso de EXTERNAL fará com que as operações de sub-cadeia de caracteres em valores muito grandes dos tipos de dados text e bytea sejam executadas mais rapidamente, à custa de maior espaço de armazenamento. Veja TOAST para obter mais informações.

COMPRESSION método_de_compressão #

A cláusula COMPRESSION define o método de compressão para a coluna. A compressão tem suporte apenas para os tipos de dados de largura variável, sendo usada apenas quando o modo de armazenamento da coluna é main ou extended. (Veja ALTER TABLE para obter informações sobre os modos de armazenamento de coluna.) Definir esta propriedade para tabela particionada não tem efeito direto, porque estas tabelas não possuem armazenamento próprio, mas o valor configurado será herdado pelas partições recém-criadas. Os métodos de compressão com suporte são pglz e lz4. (lz4 está disponível apenas se foi usado --with-lz4 ao construir o PostgreSQL.) Além desses, o método_de_compressão pode ser default para especificar explicitamente o comportamento padrão, que é consultar o parâmetro de configuração default_toast_compression no momento da inserção de dados para determinar o método a ser usado.

INHERITS ( tabela_mãe [, ... ] ) #

A cláusula opcional INHERITS especifica uma lista de tabelas das quais a nova tabela herda automaticamente todas as colunas. As tabelas mãe podem ser tabelas simples ou tabelas estrangeiras.

O uso de INHERITS cria um relacionamento persistente entre a nova tabela filha e sua(s) tabela(s) mãe. As modificações de esquema na(s) mãe(s) normalmente se propagam também para as filhas e, por padrão, os dados da tabela filha são incluídos nas varreduras da(s) mãe(s).

Se existir o mesmo nome de coluna em mais de uma tabela mãe, será relatado erro, a menos que os tipos de dados das colunas correspondam em cada uma das tabelas mãe. Se não houver conflito, as colunas duplicadas serão mescladas para formar uma única coluna na nova tabela. Se a lista de nomes de coluna da nova tabela contiver um nome de coluna que também seja herdado, o tipo de dados também deverá corresponder à(s) coluna(s) herdada(s), e as definições de coluna serão mescladas em uma. Se a nova tabela especificar explicitamente um valor padrão para a coluna, este padrão substituirá quaisquer padrões das declarações herdadas da coluna. Caso contrário, todas as mães que especificarem valor padrão para a coluna deverão especificar o mesmo valor padrão, ou será relatado erro.

As restrições CHECK são mescladas essencialmente da mesma maneira que as colunas: se várias tabelas mãe e/ou a nova definição de tabela contiverem restrições CHECK com nomes idênticos, todas estas restrições deverão ter a mesma expressão de verificação, ou será relatado erro. As restrições com o mesmo nome e expressão serão mescladas em uma cópia. Uma restrição marcada como NO INHERIT na tabela mãe não será considerada. Note que uma restrição CHECK sem nome na nova tabela nunca será mesclada, porque sempre será escolhido um nome único para ela.

As configurações de coluna STORAGE também são copiadas das tabelas mãe.

Se a coluna na tabela mãe for uma coluna de identidade, esta propriedade não será herdada. Uma coluna na tabela filha pode ser declarada como coluna de identidade, se desejado.

PARTITION BY { RANGE | LIST | HASH } ( { nome_da_coluna | ( expressão ) } [ classe_de_operador ] [, ...] ) #

A cláusula opcional PARTITION BY especifica a estratégia de particionamento da tabela. A tabela assim criada é chamada de tabela particionada. A lista de colunas ou expressões entre parênteses forma a chave de partição da tabela. Quando se usa o particionamento por intervalo ou hash, a chave de partição pode incluir várias colunas ou expressões (até 32, mas este limite pode ser alterado ao construir o PostgreSQL), mas para o particionamento de lista, a chave de partição deve consistir em uma única coluna ou expressão.

O particionamento de intervalo e lista requer uma classe de operador Árvore-B, enquanto o particionamento de hash requer uma classe de operador hash. Se não for especificada nenhuma classe de operador explicitamente, a classe de operador padrão do tipo apropriado será usada; se não existir nenhuma classe de operador padrão, será relatado erro. Quando é usado o particionamento de hash, a classe de operador usada deve implementar a função de suporte 2 (veja Rotinas de suporte do método de índice para obter detalhes).

Uma tabela particionada é dividida em subtabelas (chamadas partições), criadas usando comandos CREATE TABLE distintos. A própria tabela particionada fica vazia. Uma linha de dados inserida na tabela é roteada para uma partição com base no valor de colunas ou expressões na chave de partição. Se nenhuma partição existente corresponder aos valores na nova linha, será relatado erro.

Veja Particionamento de tabela para obter mais informações sobre particionamento de tabelas.

PARTITION OF tabela_mãe { FOR VALUES especificação_de_limite_de_partição | DEFAULT } #

Cria a tabela como partição da tabela mãe especificada. A tabela pode ser criada como uma partição para valores específicos usando FOR VALUES, ou como a partição padrão usando DEFAULT. Quaisquer índices, restrições e gatilhos no nível de linha definidos pelo usuário existentes na tabela mãe são clonados na nova partição.

A especificação_de_limite_de_partição deve corresponder ao método de particionamento e à chave de partição da tabela mãe, e não deve se sobrepor a nenhuma partição existente dessa mãe. A forma com IN é usada para particionamento de lista, a forma com FROM e TO é usada para particionamento de intervalo, e a forma com WITH é usada para particionamento de hash.

A expressão_de_limite_de_partição é qualquer expressão livre de variável (subconsultas, funções de janela, funções de agregação e funções que retornam conjunto não são permitidas). Seu tipo de dados deve corresponder ao tipo de dados da coluna de chave de partição correspondente. A expressão é avaliada uma vez no momento da criação da tabela, portanto, pode até conter expressões voláteis como CURRENT_TIMESTAMP.

Ao criar uma partição de lista, pode ser especificado NULL para indicar que a partição permite que a coluna de chave de partição receba o valor NULL. No entanto, não pode haver mais de uma partição de lista para uma determinada tabela mãe. Não pode ser especificado NULL para partições de intervalo.

Ao criar uma partição de intervalo, o limite inferior especificado com FROM é um limite inclusivo, enquanto o limite superior especificado com TO é um limite exclusivo. Ou seja, os valores especificados na lista FROM são valores válidos das colunas de chave de partição correspondentes para esta partição, enquanto aqueles na lista TO não são. Note que esta declaração deve ser entendida segundo as regras de comparação por linha (Comparação de construtor de linha). Por exemplo, dado PARTITION BY RANGE (x,y), uma partição definida usando FROM (1, 2) TO (3, 4), permite x=1 com qualquer y>=2, x=2 com qualquer y não nulo, e x=3 com qualquer y<4.

Podem ser usados os valores especiais MINVALUE e MAXVALUE ao criar uma partição de intervalo, para indicar não haver limite inferior ou superior no valor da coluna. Por exemplo, uma partição definida usando FROM (MINVALUE) TO (10) permite qualquer valor menor que 10, e uma partição definida usando FROM (10) TO (MAXVALUE) permite qualquer valor maior ou igual a 10.

Ao criar uma partição de intervalo envolvendo mais de uma coluna, também pode fazer sentido usar MAXVALUE como parte do limite inferior, e MINVALUE como parte do limite superior. Por exemplo, uma partição definida usando FROM (0, MAXVALUE) TO (10, MAXVALUE) permite qualquer linha em que a primeira coluna de chave de partição seja maior que 0, e menor ou igual a 10. Da mesma forma, uma partição definida usando FROM ('a', MINVALUE) TO ('b', MINVALUE) permite qualquer linha em que a primeira coluna de chave de partição comece com "a".

Note que se for usado MINVALUE ou MAXVALUE para uma coluna de limite de particionamento, o mesmo valor deverá ser usado para todas as colunas subsequentes. Por exemplo, (10, MINVALUE, 0) não é um limite válido; deve ser escrito (10, MINVALUE, MINVALUE).

Note também que alguns tipos de dados, como timestamp, possuem a noção de "infinity", que é apenas mais um valor que pode ser armazenado, sendo diferente de MINVALUE e MAXVALUE, que não são valores reais que podem ser armazenados, mas sim formas de dizer que o valor é ilimitado. MAXVALUE pode ser visto como maior que qualquer outro valor, inclusive "infinity", e MINVALUE pode ser visto como sendo menor que qualquer outro valor, inclusive "minus infinity". Assim, o intervalo FROM ('infinity') TO (MAXVALUE) não é um intervalo vazio; ele permite que precisamente um valor seja armazenado — "infinity".

Se for especificado DEFAULT, a tabela será criada como a partição padrão da tabela mãe. Esta opção não está disponível para tabelas particionadas por hash. Um valor de chave de partição que não se ajusta a nenhuma outra partição definida da tabela mãe, será roteado para a partição padrão.

Quando uma tabela tem a partição DEFAULT existente, e uma nova partição é adicionada a esta tabela, a partição padrão deve ser examinada para verificar se não contém nenhuma linha que se adéque à nova partição. Se a partição padrão tiver muitas linhas, este processo pode ser lento. A verificação será ignorada se a partição padrão for uma tabela estrangeira, ou se tiver uma restrição provando que não pode conter linhas que devem ser colocadas na nova partição.

Ao criar uma partição de hash, devem ser especificados um módulo e um resto. O módulo deve ser um número inteiro positivo, e o resto deve ser um número inteiro não negativo menor que o módulo. Normalmente, ao configurar inicialmente uma tabela particionada por hash, deve-se escolher um módulo igual ao número de partições, e atribuir a cada tabela o mesmo módulo e um resto diferente (veja os exemplos abaixo). Entretanto, não é necessário que todas as partições tenham o mesmo módulo, apenas que todo módulo que ocorre entre as partições de uma tabela particionada por hash seja um fator do próximo módulo maior. Isto permite que o número de partições seja aumentado incrementalmente sem precisar mover todos os dados de uma só vez. Por exemplo, supondo que se tenha uma tabela particionada por hash com 8 partições, cada uma das quais possui módulo 8, mas se ache necessário aumentar o número de partições para 16. Pode-se separar uma das partições Módulo-8, criar duas novas partições Módulo-16, cobrindo a mesma parte do espaço-chave (uma com resto igual ao resto da partição separada, e a outra com resto igual a este valor mais 8) e repovoar com dados. Este procedimento pode ser repetido – talvez mais tarde – para cada Módulo-8 até que não reste mais nenhum. Embora isto ainda possa envolver uma grande quantidade de movimento de dados em cada etapa, ainda é melhor do que ter que criar uma tabela inteiramente nova e mover todos os dados de uma só vez.

Uma partição deve ter os mesmos nomes e tipos de dados das colunas da tabela particionada à qual pertence. As modificações nos nomes ou tipos de dados das colunas de uma tabela particionada se propagam automaticamente para todas as partições. As restrições CHECK são herdadas automaticamente por todas as partições, mas uma partição individual pode especificar restrições CHECK adicionais; restrições adicionais, com mesmo nome e condição que na tabela mãe, são mescladas com a restrição das mães. Podem ser especificados valores padrão em separado para cada partição. Mas deve-se observar que o valor padrão de uma partição não é aplicado ao inserir uma tupla através de uma tabela particionada.

As linhas inseridas em uma tabela particionada são roteadas, automaticamente, para a partição correta. Se não houver partição adequada, será relatado erro.

Operações como TRUNCATE, que normalmente afetam a tabela mãe e todas as suas filhas na hierarquia de herança, se propagam em cascata para todas as partições, mas também podem ser realizadas em uma partição individual.

Note que criar uma partição usando PARTITION OF requer a obtenção de um bloqueio ACCESS EXCLUSIVE na tabela particionada mãe. Da mesma forma, excluir uma partição usando DROP TABLE requer a obtenção de um bloqueio ACCESS EXCLUSIVE na tabela mãe. É possível usar ALTER TABLE ATTACH/DETACH PARTITION para realizar estas operações com um bloqueio mais fraco, reduzindo assim a interferência com operações simultâneas na tabela particionada.

LIKE tabela_de_origem [ opção_do_LIKE ... ] #

A cláusula LIKE especifica uma tabela da qual a nova tabela copia automaticamente todos os nomes de colunas, seus tipos de dados, e suas restrições de não nulo.

Ao contrário de INHERITS, a nova tabela e a tabela original ficam completamente independentes após o término da criação. As alterações na tabela original não serão aplicadas à nova tabela, e não é possível incluir dados da nova tabela em varreduras da tabela original.

Também de forma diferente de INHERITS, as colunas e restrições copiadas por LIKE não são mescladas com colunas e restrições com nomes semelhantes. Se o mesmo nome for especificado explicitamente, ou em outra cláusula LIKE, será relatado erro.

As cláusulas opcionais opção_do_LIKE especificam quais propriedades adicionais da tabela original devem ser copiadas. Especificar INCLUDING copia a propriedade, especificar EXCLUDING omite a propriedade. O padrão é EXCLUDING. Se forem feitas várias especificações para o mesmo tipo de objeto, será usada a última. As opções disponíveis são:

INCLUDING COMMENTS #

Serão copiados os comentários das colunas, restrições e índices. O comportamento padrão é não copiar os comentários, resultando em colunas, restrições e índices na nova tabela sem comentários.

INCLUDING COMPRESSION #

Será copiado o método de compressão das colunas. O comportamento padrão é não copiar os métodos de compressão, resultando em colunas com o método de compressão padrão.

INCLUDING CONSTRAINTS #

Serão copiadas as restrições CHECK. Não é feita nenhuma distinção entre restrições de coluna e restrições de tabela. As restrições de não nulo são sempre copiadas para a nova tabela.

INCLUDING DEFAULTS #

Serão copiadas as expressões de valor padrão das colunas. Caso contrário, as expressões de valor padrão não serão copiadas, resultando em colunas na nova tabela com valor padrão igual a nulo. Note que copiar valores padrão que chamam funções que modificam o banco de dados, como nextval, pode criar uma ligação funcional entre a tabela original e a nova tabela.

INCLUDING GENERATED #

Quaisquer expressões de geração, bem como a escolha armazenada/virtual das definições de coluna copiadas, serão copiadas. Por padrão, as colunas da nova tabela serão colunas base regulares.

INCLUDING IDENTITY #

Será copiada qualquer especificação de coluna de identidade. Será criada uma nova sequência para cada coluna de identidade da nova tabela, separada das sequências associadas à tabela original.

INCLUDING INDEXES #

Serão criados os índices e as restrições PRIMARY KEY, UNIQUE, e EXCLUDE da tabela original na nova tabela. Os nomes dos novos índices e restrições são escolhidos conforme as regras padrão, independentemente de como os índices e restrições originais receberam seus nomes. (Este comportamento evita possíveis falhas de nome duplicado para os novos índices.)

INCLUDING STATISTICS #

São copiadas as estatísticas estendidas para a nova tabela.

INCLUDING STORAGE #

Será copiada a definição de STORAGE. O comportamento padrão é não copiar as configurações de STORAGE, resultando em colunas copiadas na nova tabela com configurações padrão específicas do tipo de dados. Para obter mais informações sobre a definição de STORAGE, veja TOAST.

INCLUDING ALL #

INCLUDING ALL é uma forma abreviada para selecionar todas as opções individuais disponíveis. (Pode ser útil escrever cláusulas EXCLUDING individuais após INCLUDING ALL para selecionar todas, exceto algumas opções específicas.)

A cláusula LIKE também pode ser usada para copiar definições de colunas de visões, tabelas estrangeiras, ou tipos de dados compostos. As opções que não se aplicam (por exemplo, INCLUDING INDEXES de uma visão) são ignoradas.

CONSTRAINT nome_da_restrição #

Nome opcional para a restrição de coluna ou tabela. Se a restrição for violada, o nome da restrição estará presente nas mensagens de erro, portanto, nomes de restrição como nota deve ser positiva podem ser usados para comunicar informações úteis de restrição às aplicações cliente. (Há necessidade de aspas para especificar nomes de restrição que contêm espaços.) Se o nome da restrição não for especificado, o sistema irá gerar um nome para a restrição.

NOT NULL [ NO INHERIT ] #

A coluna não pode conter valores nulos.

Uma restrição marcada com NO INHERIT não será propagada para as tabelas filhas.

NULL #

A coluna pode conter valores nulos. Este é o padrão.

Esta cláusula é fornecida apenas para manter compatibilidade com bancos de dados SQL fora do padrão. Seu uso é desencorajado em novas aplicações.

CHECK ( expressão ) [ NO INHERIT ] #

A cláusula CHECK especifica uma expressão que produz um resultado booleano, que as linhas novas ou atualizadas devem satisfazer, para que uma operação de inserção ou atualização seja bem-sucedida. Expressões avaliadas como TRUE ou UNKNOWN são bem-sucedidas. Caso qualquer linha de uma operação de inserção ou atualização produza um resultado FALSE é relatado erro, e a inserção ou atualização não altera o banco de dados. Uma restrição de verificação especificada como restrição de coluna deve fazer referência apenas ao valor dessa coluna, enquanto uma expressão que aparece em uma restrição de tabela pode fazer referência a várias colunas.

No momento, as expressões CHECK não podem conter subconsultas, nem se referir a variáveis que não sejam colunas da linha corrente (veja Restrições de verificação). Pode ser referenciada a coluna do sistema tableoid, mas não qualquer outra coluna do sistema.

Uma restrição marcada com NO INHERIT não será propagada para as tabelas filhas.

Quando a tabela possui várias restrições CHECK, elas são testadas para cada linha em ordem alfabética por nome, após a verificação das restrições NOT NULL. (As versões do PostgreSQL anteriores a 9.5 não honravam nenhuma ordem de disparo específica para restrições CHECK.)

DEFAULT expressão_padrão #

A cláusula DEFAULT atribui um valor de dados padrão para a coluna em cuja definição aparece. O valor é qualquer expressão livre de variável (em particular, referências cruzadas a outras colunas na tabela corrente não são permitidas). As subconsultas também não são permitidas. O tipo de dados do valor da expressão do padrão deve corresponder ao tipo de dados da coluna.

A expressão do valor padrão será usada em qualquer operação de inserção que não especifique um valor para a coluna. Se não houver valor padrão para uma coluna, o valor padrão será o valor nulo.

GENERATED ALWAYS AS ( expressão_de_geração ) [ STORED | VIRTUAL ] #

Esta cláusula cria a coluna como uma coluna gerada. A coluna não pode ser escrita e, ao ser lida, será retornado o resultado da expressão especificada.

Quando for especificado VIRTUAL, a coluna será calculada no momento da leitura não ocupando espaço de armazenamento. Quando for especificado STORED, a coluna será calculada no momento da escrita e armazenada em disco. O padrão é VIRTUAL.

A expressão de geração pode se referir a outras colunas da tabela, mas não a outras colunas geradas. Todas as funções e operadores utilizados devem ser imutáveis. Não são permitidas referências a outras tabelas.

Uma coluna virtual gerada não pode ter um tipo de dados definido pelo usuário, e a expressão de geração de uma coluna virtual gerada não deve fazer referência a funções ou tipos de dados definidos pelo usuário, ou seja, só pode usar funções ou tipos de dados nativos. Isto também se aplica indiretamente, como em funções ou tipos de dados que estão na base de operadores ou conversões de tipo de dados. (Esta restrição não existe para colunas geradas e armazenadas.)

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( opções_da_sequência ) ] #

Esta cláusula cria a coluna como uma coluna de identidade. Terá uma sequência implícita associada a ela e, em linhas recém-inseridas, a coluna receberá automaticamente os valores dessa sequência. Esta coluna é implicitamente NOT NULL.

As cláusulas ALWAYS e BY DEFAULT determinar como os valores especificados explicitamente pelo usuário são tratados nos comandos INSERT e UPDATE.

No comando INSERT, se for escolhido ALWAYS, o valor especificado pelo usuário só será aceito se o comando INSERT especificar OVERRIDING SYSTEM VALUE. Se for escolhido BY DEFAULT, então o valor especificado pelo usuário terá precedência. Veja o comando INSERT para obter detalhes. (No comando COPY, os valores especificados pelo usuário são sempre usados independentemente dessa configuração.)

Em um comando UPDATE, se for escolhido ALWAYS, qualquer atualização da coluna para qualquer valor diferente do DEFAULT será rejeitada. Se for escolhido BY DEFAULT, a coluna pode ser atualizada normalmente. (Não existe a cláusula OVERRIDING no comando UPDATE.)

A cláusula opcional opções_da_sequência pode ser usada para substituir os parâmetros da sequência. As opções disponíveis incluem as mostradas para CREATE SEQUENCE, mais SEQUENCE NAME nome_da_sequência, LOGGED e UNLOGGED, que permitem selecionar o nome e o nível de persistência da sequência. Sem SEQUENCE NAME, o sistema escolhe um nome não utilizado para a sequência. Sem LOGGED ou UNLOGGED, a sequência terá o mesmo nível de persistência que a tabela.

UNIQUE [ NULLS [ NOT ] DISTINCT ] (restrição de coluna)
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( nome_da_coluna [, ... ] [, nome_da_coluna WITHOUT OVERLAPS ] ) [ INCLUDE ( nome_da_coluna [, ...]) ] (restrição de tabela) #

A restrição UNIQUE especifica que um grupo de uma ou mais colunas de uma tabela pode conter apenas valores únicos. O comportamento de uma restrição de unicidade de tabela é o mesmo de uma restrição de unicidade de coluna, com a capacidade adicional de abranger várias colunas. A restrição, portanto, impõe que quaisquer duas linhas devem diferir em pelo menos uma dessas colunas.

Se for especificada a opção WITHOUT OVERLAPS para a última coluna, esta coluna será verificada quanto a sobreposições em vez de igualdade. Neste caso, as outras colunas da restrição permitirão duplicidades, desde que não se sobreponham na coluna WITHOUT OVERLAPS. (Isto às vezes é chamado de chave temporal, se a coluna for um intervalo de datas ou registros de data e hora, mas o PostgreSQL permite intervalos sobre qualquer tipo de dados base.) Na prática, esta restrição é imposta com uma restrição EXCLUDE em vez de uma restrição UNIQUE. Então, por exemplo, UNIQUE (id, valid_at WITHOUT OVERLAPS) se comporta como EXCLUDE USING GIST (id WITH =, valid_at WITH &&). A colunas WITHOUT OVERLAPS deve ter um tipo de dados intervalo ou multi-intervalo. Não são permitidos intervalos/multi-intervalos vazios. As colunas não-WITHOUT OVERLAPS da restrição podem ser de qualquer tipo de dados que possa ser comparada quanto à igualdade por um índice GiST. Por padrão, apenas tipos de intervalo têm suporte, mas pode-se usar outros tipos de dados adicionando a extensão btree_gist. (que é a forma esperada de usar esta funcionalidade).

Para fins de restrição de unicidade, valores nulos não são considerados iguais, a menos que seja especificado NULLS NOT DISTINCT

Cada restrição de unicidade deve designar um conjunto de colunas que seja diferente do conjunto de colunas designado por qualquer outra restrição de unicidade, ou de chave primária, definida para a tabela. (Caso contrário, as restrições de unicidade redundantes serão descartadas.)

Ao estabelecer uma restrição de unicidade numa hierarquia de partição de vários níveis, todas as colunas da chave de partição da tabela particionada mãe, bem como as de todas as tabelas particionadas filhas, devem ser incluídas na definição da restrição.

A adição de uma restrição de unicidade cria, automaticamente, um índice Árvore-B único na coluna, ou grupo de colunas, usado na restrição. Mas se a restrição incluir uma cláusula WITHOUT OVERLAPS, será usado um índice GiST. O índice criado tem o mesmo nome que a restrição de unicidade.

A cláusula opcional INCLUDE adiciona a este índice uma ou mais colunas que são simplesmente carga: a unicidade não é imposta a estas colunas, e o índice não pode ser procurado com base nessas colunas. Entretanto, estas colunas podem ser recuperadas por varredura somente de índice. Note que, embora a restrição não seja imposta às colunas incluídas, ela ainda depende delas. Como consequência, algumas operações nessas colunas (por exemplo, DROP COLUMN) podem causar exclusão em cascata da restrição e do índice.

PRIMARY KEY (restrição de coluna)
PRIMARY KEY ( nome_da_coluna [, ... ] [, nome_da_coluna WITHOUT OVERLAPS ] ) [ INCLUDE ( nome_da_coluna [, ...]) ] (restrição de tabela) #

A restrição PRIMARY KEY especifica que uma coluna, ou colunas, de uma tabela podem conter apenas valores únicos (não duplicados) não nulos. Pode ser especificada apenas uma chave primária para uma tabela, seja como restrição de coluna ou como restrição de tabela.

A restrição de chave primária deve designar um conjunto de colunas diferente do conjunto de colunas designado por qualquer restrição de unicidade definida para a mesma tabela. (Caso contrário, a restrição de unicidade é redundante, sendo por isto descartada.)

A restrição PRIMARY KEY impõe as mesmas restrições nos dados que uma combinação de UNIQUE com NOT NULL. Entretanto, identificar um conjunto de colunas como chave primária também fornece metadados sobre o projeto do esquema, porque uma chave primária implica que outras tabelas podem contar com este conjunto de colunas como um identificador único para as linhas.

Quando colocada em uma tabela particionada, as restrições PRIMARY KEY compartilham as condições descritas anteriormente para a restrição UNIQUE.

Adicionar uma restrição PRIMARY KEY irá criar automaticamente um índice de unicidade Árvore-B na coluna ou grupo de colunas usado na restrição, ou GiST se for especificado WITHOUT OVERLAPS.

A cláusula opcional INCLUDE adiciona a este índice uma ou mais colunas que são simplesmente carga: a unicidade não é imposta a estas colunas, e o índice não pode ser pesquisado com base nessas colunas. Entretanto, estas colunas podem ser recuperadas por varredura somente de índice. Note que, embora a restrição não seja imposta às colunas incluídas, ela ainda depende delas. Como consequência, algumas operações nessas colunas (por exemplo, DROP COLUMN) podem causar exclusão em cascata da restrição e do índice.

EXCLUDE [ USING método_de_índice ] ( elemento_excluído WITH operador [, ... ] ) parâmetros_de_índice [ WHERE ( predicado ) ] #

A cláusula EXCLUDE define uma restrição de exclusão, que garante que se quaisquer duas linhas forem comparadas na(s) coluna(s) ou expressão(ões) especificada(s) usando o(s) operador(es) especificado(s), nem todas estas comparações irão retornar TRUE. Se todos os operadores especificados testarem a igualdade, será equivalente a uma restrição UNIQUE, embora a restrição de unicidade comum seja mais rápida. Entretanto, as restrições de exclusão podem especificar restrições que são mais gerais do que a simples igualdade. Por exemplo, pode-se especificar a restrição de não haver duas linhas na tabela contendo círculos sobrepostos (veja Tipos de dados geométricos) usando o operador &&. Os operadores devem ser comutativos.

As restrições de exclusão são implementadas usando um índice com o mesmo nome da restrição; portanto, cada operador especificado deve ser associado a uma classe de operador apropriada (veja Classes e famílias de operador) para o método de acesso ao índice método_de_índice. Cada elemento_excluído define uma coluna do índice, podendo, opcionalmente, especificar uma ordenação, uma classe de operador, parâmetros da classe de operador e/ou opções de ordenação; conforme descrito detalhadamente em CREATE INDEX.

O método de acesso deve dar suporte a amgettuple (veja Definição da interface do método de acesso a índice); no momento, isto significa que GIN não pode ser usado. Embora seja permitido, há pouco sentido em usar índices de Árvore-B ou hash com restrição de exclusão, porque isto não faz nada que uma restrição de unicidade comum não faça melhor. Então, na prática o método de acesso sempre será GiST ou SP-GiST.

O predicado permite especificar uma restrição de exclusão em um subconjunto da tabela; internamente isto cria um índice parcial. Note que é necessário usar parênteses em torno do predicado.

Ao estabelecer uma restrição de exclusão para uma hierarquia de partições multinível, todas as colunas da chave de partição da tabela particionada de destino, bem como as de todas as suas tabelas particionadas descendentes, devem ser incluídas na definição da restrição. Além disso, estas colunas devem ser comparadas usando o operador de igualdade. Estas restrições garantem que linhas potencialmente conflitantes coexistam na mesma partição. A restrição também pode se referir a outras colunas que não fazem parte de nenhuma chave de partição, as quais podem ser comparadas usando qualquer operador apropriado.

REFERENCES tabela_referenciada [ ( coluna_referenciada ) ] [ MATCH tipo_de_correspondência ] [ ON DELETE ação_referencial ] [ ON UPDATE ação_referencial ] (restrição de coluna)
FOREIGN KEY ( nome_da_coluna [, ... ] [, PERIOD nome_da_coluna ] ) REFERENCES tabela_referenciada [ ( coluna_referenciada [, ... ] [, PERIOD coluna_referenciada ] ) ] [ MATCH tipo_de_correspondência ] [ ON DELETE ação_referencial ] [ ON UPDATE ação_referencial ] (restrição de tabela) #

Estas cláusulas especificam uma restrição de chave estrangeira, que exige que um grupo de uma ou mais colunas da nova tabela contenha apenas valores que correspondam aos valores na(s) coluna(s) referenciada(s) de alguma linha da tabela referenciada. Se for omitida a lista de coluna_referenciada, será utilizada a chave primária da tabela_referenciada Caso contrário, a lista de coluna_referenciada deverá se referir às colunas de uma restrição de chave primária ou de unicidade não postergável, ou a colunas de um índice de unicidade não parcial.

Se a última coluna estiver marcada com PERIOD, ela será tratada de forma especial. Enquanto as colunas não-PERIOD são comparadas para verificar a igualdade (devendo haver pelo menos uma), a coluna PERIOD não é. Em vez disso, a restrição é considerada satisfeita se a tabela referenciada tiver registros correspondentes (com base nas partes não-PERIOD da chave) cujos valores de PERIOD combinados cubram completamente os valores do registro de referência. Em outras palavras, a referência deve ter um referente durante toda a sua duração. Esta coluna deve ser do tipo de dados intervalo ou multi-intervalo. Além disso, a tabela referenciada deve ter uma chave primária ou restrição de unicidade declarada com WITHOUT OVERLAPS. Finalmente, se a chave estrangeira tiver uma especificação PERIOD na definição da coluna (especificação de nome_da_coluna), a coluna_referenciada correspondente, se existir, também deverá ser marcada com PERIOD. Se a cláusula coluna_referenciada for omitida e, portanto, a restrição de chave primária da tabela_referenciada for escolhida, a chave primária deverá ter sua última coluna marcada com WITHOUT OVERLAPS.

Para cada par de colunas de referência e colunas referenciadas, se elas forem de um tipo de dados que permite ordenação, as ordenações deverão ser ambas determinísticas ou ambas iguais. Isto garante que as duas colunas tenham uma noção consistente de igualdade.

O usuário deve ter a permissão REFERENCES na tabela referenciada (na tabela inteira ou nas colunas específicas referenciadas). A adição de uma restrição de chave estrangeira requer um bloqueio SHARE ROW EXCLUSIVE na tabela referenciada. Note que não é possível definir restrições de chave estrangeira entre tabelas temporárias e tabelas permanentes.

Os valores inseridos nas colunas que fazem a referência, são comparados com os valores das colunas referenciadas da tabela referenciada, usando o tipo de correspondência indicado. Existem três tipos de correspondência: MATCH FULL, MATCH PARTIAL, e MATCH SIMPLE (que é o padrão). MATCH FULL não permite que uma coluna de uma chave estrangeira de várias colunas seja nula, a menos que todas as colunas da chave estrangeira sejam nulas; se todas forem nulas, a linha não precisa ter uma correspondência na tabela referenciada. MATCH SIMPLE permite que qualquer uma das colunas de chave estrangeira seja nula; se alguma delas for nula, a linha não precisa ter uma correspondência na tabela referenciada. MATCH PARTIAL ainda não está implementado. (Claro que podem ser aplicadas restrições NOT NULL às colunas que fazem referência para evitar que estes casos aconteçam.)

Além disso, quando os dados nas colunas referenciadas são alterados, certas ações são executadas nos dados nas colunas dessa tabela. A cláusula ON DELETE especifica a ação a ser executada quando uma linha referenciada na tabela referenciada está sendo excluída. Da mesma forma, a cláusula ON UPDATE especifica a ação a ser executada quando uma coluna referenciada na tabela referenciada está sendo atualizada para um novo valor. Se a linha for atualizada, mas a coluna referenciada não for alterada, nenhuma ação será executada. As ações referenciais são executadas como parte do comando de alteração de dados, mesmo que a restrição seja postergada. Existem as seguintes ações possíveis para cada cláusula:

NO ACTION #

Produz um erro se a exclusão ou atualização criar uma violação de restrição de chave estrangeira. Se a restrição for postergada, este erro será gerado no momento da verificação da restrição, caso ainda existam linhas que façam referência a ela. Esta é a ação padrão.

RESTRICT #

Produz um erro se uma linha a ser excluída ou atualizada corresponder a uma linha na tabela de referência. Isto impede a ação mesmo que o estado após a ação não viole a restrição de chave estrangeira. Em particular, impede a atualização de linhas referenciadas para valores que são distintos, mas que, ao serem comparados, são considerados iguais. (Mas isto não impede atualizações nulas (no-op) que atualizam uma coluna para o mesmo valor.)

Em uma chave estrangeira temporal, esta opção não tem suporte.

CASCADE #

Exclui todas as linhas que fazem referência à linha excluída, ou atualiza os valores da(s) coluna(s) que fazem referência para os novos valores das colunas referenciadas, respectivamente.

Em uma chave estrangeira temporal, esta opção não tem suporte.

SET NULL [ ( nome_da_coluna [, ... ] ) ] #

Defina todas as colunas de referência, ou um subconjunto específico delas, como nulas. Um subconjunto de colunas só pode ser especificado para ações ON DELETE.

Em uma chave estrangeira temporal, esta opção não tem suporte.

SET DEFAULT [ ( nome_da_coluna [, ... ] ) ] #

Define todas as colunas de referência, ou um subconjunto específico delas, com seus valores padrão. Um subconjunto de colunas só pode ser especificado para ações ON DELETE. (Deve haver uma linha na tabela referenciada que corresponda aos valores padrão, caso não sejam nulos, ou a operação irá falhar.)

Em uma chave estrangeira temporal, esta opção não tem suporte.

Se as colunas referenciadas forem alteradas com frequência, pode fazer sentido adicionar um índice às colunas que fazem referência, para que as ações referenciais associadas à restrição de chave estrangeira possam ser executadas com mais eficiência.

DEFERRABLE
NOT DEFERRABLE #

Controla se a restrição pode ser postergada. Uma restrição que não é postergável será verificada imediatamente após cada comando. A verificação das restrições postergáveis pode ser adiada até o final da transação (usando o comando SET CONSTRAINTS). O padrão é NOT DEFERRABLE. No momento, apenas as restrições UNIQUE, PRIMARY KEY, EXCLUDE, e REFERENCES (chave estrangeira) aceitam esta cláusula. As restrições NOT NULL e CHECK não são postergáveis. Note que as restrições postergáveis não podem ser usadas como árbitros de conflito em um comando INSERT que inclua a cláusula ON CONFLICT DO UPDATE.

INITIALLY IMMEDIATE
INITIALLY DEFERRED #

Se a restrição for postergável, esta cláusula especifica o momento padrão para verificar a restrição. Se a restrição for INITIALLY IMMEDIATE, ela é verificada após cada instrução. Este é o comportamento padrão. Se a restrição for INITIALLY DEFERRED, ela é verificada apenas no final da transação. O momento de verificação da restrição pode ser alterado com o comando SET CONSTRAINTS.

ENFORCED
NOT ENFORCED #

Quando a restrição é ENFORCED, então o sistema de banco de dados garante que a restrição seja satisfeita, verificando-a em momentos apropriados. (após cada declaração ou ao final da transação, conforme apropriado.). Este é o padrão. Se a restrição for NOT ENFORCED, o sistema de banco de dados não irá verificar a restrição. Cabe então ao código da aplicação garantir que as restrições sejam satisfeitas. O sistema de banco de dados ainda pode assumir que os dados realmente satisfazem a restrição para decisões de otimização, mesmo quando isto não afeta a correção do resultado.

As restrições NOT ENFORCED pode ser útil como documentação caso a verificação da restrição em tempo de execução tenha um custo alto.

No momento, só é compatível com chaves estrangeiras e restrições CHECK.

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.

Ao criar uma partição, o método de acesso à tabela será o mesmo da tabela particionada, se estiver definido.

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

Esta cláusula especifica parâmetros de armazenamento opcionais para a tabela ou índice; veja Parâmetros de armazenamento abaixo 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 versões anteriores para declarar uma tabela WITHOUT OIDS. A criaçã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). Quando usado em tabela particionada, não é propagado em suas partições.

DROP #

A tabela temporária será removida no final do bloco de transação corrente. Quando usada em tabela particionada, esta ação remove suas partições e, quando usada em tabelas com hierarquia de herança, remove as filhas dependentes.

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á criada. Se não for especificado será consultado default_tablespace, ou temp_tablespaces se a tabela for temporária. Para tabelas particionadas, como nenhum armazenamento é necessário para a tabela em si, o espaço de tabelas especificado substitui default_tablespace como o espaço de tabelas padrão a ser usado para quaisquer partições recém-criadas quando nenhum outro espaço de tabelas for especificado explicitamente.

USING INDEX TABLESPACE nome_do_espaço_de_tabelas #

Esta cláusula permite a seleção do espaço de tabelas onde o índice associado a uma restrição UNIQUE, PRIMARY KEY, ou EXCLUDE vai ser criado. Se não for especificado é consultado default_tablespace, ou temp_tablespaces se a tabela for temporária.

Parâmetros de armazenamento

A cláusula WITH pode especificar parâmetros de armazenamento para tabelas e para índices associados a uma restrição UNIQUE, PRIMARY KEY ou EXCLUDE. Os parâmetros de armazenamento para índices são documentados em CREATE INDEX. Os parâmetros de armazenamento atualmente disponíveis para as tabelas estão listados abaixo. Para muitos desses parâmetros, conforme mostrado, há um parâmetro adicional com o mesmo nome prefixado com toast., que controla o comportamento da tabela TOAST secundária da tabela, se houver (veja TOAST para obter mais informações sobre TOAST). Se um valor de parâmetro de tabela for definido, e o parâmetro toast. equivalente não for, a tabela TOAST usará o valor do parâmetro da tabela. A especificação desses parâmetros para tabelas particionadas não tem suporte, mas podem ser especificados para as partições folha individuais.

fillfactor (inteiro) #

O fator de preenchimento de uma tabela é uma porcentagem entre 10 e 100, sendo que 100 (preenchimento completo) é o padrão. Quando é especificado um fator de preenchimento menor, as operações de INSERT preenchem as páginas da tabela somente na porcentagem indicada; o espaço restante em cada página é reservado para atualizar linhas nesta página. Isto dá ao comando UPDATE a chance de colocar a cópia atualizada de uma linha na mesma página que a original, o que é mais eficiente do que colocá-la em uma página diferente, e torna Heap-Only Tuples mais provável. Para uma tabela cujas entradas nunca são atualizadas, o preenchimento completo é a melhor escolha, mas em tabelas muito atualizadas, fatores de preenchimento menores são apropriados. Este parâmetro não pode ser definido para as tabelas TOAST.

toast_tuple_target (inteiro) #

O parâmetro toast_tuple_target especifica o tamanho mínimo da tupla necessário para se tentar comprimir e/ou mover campos grandes para tabelas TOAST, e também é o tamanho desejado para o qual se tenta reduzir o tamanho assim que esta operação começa. Este parâmetro afeta as colunas marcadas como External (para mover), Main (para compressão), ou Extended (para ambos), e se aplica apenas a novas tuplas. Não há efeito sobre as linhas existentes. Por padrão, este parâmetro é definido para permitir pelo menos 4 tuplas por bloco, que com o tamanho de bloco padrão será de 2040 bytes. Os valores válidos estão entre 128 bytes e (tamanho do bloco - cabeçalho), por padrão 8160 bytes. Mudar este valor pode não ser útil para linhas muito curtas ou muito longas. Note que a configuração padrão geralmente está próxima do ideal, sendo possível que a configuração desse parâmetro possa ter efeitos negativos em alguns casos. Este parâmetro não pode ser definido para tabelas TOAST.

parallel_workers (inteiro) #

Este parâmetro define o número de processos trabalhadores que devem ser usados para auxiliar numa verificação paralela dessa tabela. Se não for definido, o sistema determina um valor com base no tamanho da relação. O número real de processos trabalhadores escolhidos pelo planejador, ou por comandos utilitários que usam varreduras paralelas, pode ser menor, por exemplo, devido à configuração de max_worker_processes.

autovacuum_enabled, toast.autovacuum_enabled (booleano) #

Ativa ou desativa o processo autovacuum para uma tabela específica. Se verdade, o processo autovacuum executará operações automáticas de VACUUM e/ou ANALYZE nesta tabela seguindo as regras discutidas em Autovacuum. Se falso, esta tabela não será limpa automaticamente, exceto para evitar a reutilização do identificador de transação. Veja Prevenção de falhas de recomeço de ID de transação para obter mais informações sobre a prevenção desse problema. Note que o processo autovacuum não é executado de forma alguma (exceto para evitar a reutilização do identificador de transação) se o parâmetro autovacuum for falso; definir os parâmetros de armazenamento de tabelas individuais não muda esta situação. Portanto, raramente faz muito sentido definir explicitamente este parâmetro de armazenamento como true, somente como false.

vacuum_index_cleanup, toast.vacuum_index_cleanup (enum) #

Força ou desativa a limpeza do índice quando o comando VACUUM é executado nesta tabela. O valor padrão é AUTO. Com OFF, a limpeza do índice fica desativada, com ON é ativada, e com AUTO a decisão é feita dinamicamente, cada vez que o comando VACUUM é executado. O comportamento dinâmico permite que o comando VACUUM evite varrer índices desnecessariamente para remover muito poucas tuplas mortas. A desativação forçada de toda a limpeza de índice pode acelerar o comando VACUUM de forma muito significativa, mas também pode levar a índices muito inchados se as modificações da tabela forem frequentes. O parâmetro INDEX_CLEANUP do VACUUM, se especificado, substitui o valor dessa opção.

vacuum_truncate, toast.vacuum_truncate (booleano) #

Valor por tabela para o parâmetro vacuum_truncate. O parâmetro TRUNCATE do VACUUM, se especificado, substitui o valor desta opção.

autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (inteiro) #

O valor por tabela para o parâmetro autovacuum_vacuum_threshold.

autovacuum_vacuum_max_threshold, toast.autovacuum_vacuum_max_threshold (inteiro) #

O valor por tabela para o parâmetro autovacuum_vacuum_max_threshold.

autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (ponto flutuante) #

O valor por tabela para o parâmetro autovacuum_vacuum_scale_factor.

autovacuum_vacuum_insert_threshold, toast.autovacuum_vacuum_insert_threshold (inteiro) #

O valor por tabela para o parâmetro autovacuum_vacuum_insert_threshold. O valor especial -1 pode ser usado para desativar a limpeza de inserção na tabela.

autovacuum_vacuum_insert_scale_factor, toast.autovacuum_vacuum_insert_scale_factor (ponto flutuante) #

O valor por tabela para o parâmetro autovacuum_vacuum_insert_scale_factor.

autovacuum_analyze_threshold (inteiro) #

O valor por tabela para o parâmetro autovacuum_analyze_threshold.

autovacuum_analyze_scale_factor (ponto flutuante) #

O valor por tabela para o parâmetro autovacuum_analyze_scale_factor.

autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (ponto flutuante) #

O valor por tabela para o parâmetro autovacuum_vacuum_cost_delay.

autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (inteiro) #

O valor por tabela para o parâmetro autovacuum_vacuum_cost_limit.

autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (inteiro) #

O valor por tabela para o parâmetro vacuum_freeze_min_age. Note que o autovacuum irá ignorar os parâmetros autovacuum_freeze_min_age por tabela que forem maiores que a metade da definição de autovacuum_freeze_max_age para todo o sistema.

autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (inteiro) #

O valor por tabela para o parâmetro autovacuum_freeze_max_age. Note que o autovacuum irá ignorar os parâmetros autovacuum_freeze_max_age por tabela que forem maiores que a definição para todo o sistema (só pode ser definido com um valor menor).

autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (inteiro) #

O valor por tabela para o parâmetro vacuum_freeze_table_age.

autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (inteiro) #

O valor por tabela para o parâmetro vacuum_multixact_freeze_min_age. Note que o autovacuum irá ignorar parâmetros por tabela autovacuum_multixact_freeze_min_age que sejam maiores que metade da definição de autovacuum_multixact_freeze_max_age para todo o sistema.

autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (inteiro) #

O valor por tabela para o parâmetro autovacuum_multixact_freeze_max_age. Note que o autovacuum irá ignorar os parâmetros por tabela autovacuum_multixact_freeze_max_age que forem maiores que a configuração do sistema. (só pode ser definido com um tamanho menor.).

autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (inteiro) #

O valor por tabela para o parâmetro vacuum_multixact_freeze_table_age.

log_autovacuum_min_duration, toast.log_autovacuum_min_duration (inteiro) #

O valor por tabela para o parâmetro log_autovacuum_min_duration.

vacuum_max_eager_freeze_failure_rate, toast.vacuum_max_eager_freeze_failure_rate (ponto flutuante) #

O valor por tabela para o parâmetro vacuum_max_eager_freeze_failure_rate.

user_catalog_table (booleano) #

Declara a tabela como uma tabela de catálogo adicional para fins de replicação lógica. Veja Seção 47.6.2 para obter detalhes. Este parâmetro não pode ser definido para tabelas TOAST.

Notas

O PostgreSQL cria automaticamente um índice para cada restrição de unicidade e restrição de chave primária para aplicar a unicidade. Portanto, não é necessário criar um índice explicitamente para colunas de chave primária. (Veja CREATE INDEX para obter mais informações.)

As restrições de unicidade e chave primária não são herdadas na implementação corrente, tornando a combinação de herança e restrições de unicidade bastante disfuncional.

Uma tabela não pode ter mais de 1600 colunas. (Na prática, o limite efetivo geralmente é menor, devido a restrições de comprimento de tupla.)

Exemplos

Criação das tabelas films e distributors:

CREATE TABLE films (
    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
);

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name <> '')
);

Criação de tabela com matriz bidimensional:

CREATE TABLE array_int (
    vector  int[][]
);

Definição de restrição de unicidade para a tabela films. As restrições de unicidade de tabela podem ser definidas em uma ou mais colunas da tabela:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT production UNIQUE(date_prod) -- restrição de tabela
);

Definição de restrição de verificação numa coluna:

CREATE TABLE distributors (
    did     integer CHECK (did > 100), -- restrição de coluna
    name    varchar(40)
);

Definição de restrição de verificação para a tabela:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    CONSTRAINT con1 CHECK (did > 100 AND name <> '') -- restrição de tabela
);

Definição de restrição de chave primária para a tabela films:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title) -- restrição de tabela
);

Definição de restrição de chave primária para a tabela distributors. Os dois exemplos a seguir são equivalentes, o primeiro usando a sintaxe de restrição de tabela, e o segundo usando a sintaxe de restrição de coluna:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)              -- restrição de tabela
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,  -- restrição de coluna
    name    varchar(40)
);

Atribuição de um valor padrão literal para a coluna name, providenciar para que o valor padrão da coluna did seja gerado selecionando o próximo valor de um objeto de sequência, e fazer com que o valor padrão de modtime seja a hora em que a linha é inserida:

CREATE TABLE distributors (
    name      varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distributors_serial'),
    modtime   timestamp DEFAULT current_timestamp
);

Definição de duas restrições de coluna NOT NULL na tabela distributors, uma das quais recebendo o nome explicitamente:

CREATE TABLE distributors (
    did     integer CONSTRAINT no_null NOT NULL,
    name    varchar(40) NOT NULL
);

Definição de restrição de unicidade para a coluna name:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

A mesma coisa, especificado como restrição de tabela:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name)
);

Criação da mesma tabela, especificando um fator de preenchimento de 70% para a tabela e seu índice de unicidade:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

Criação da tabela circles, com restrição de exclusão impedindo a sobreposição de quaisquer dois círculos:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

Criação da tabela cinemas no espaço de tabelas diskvol1:

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE diskvol1;

Criação de tipo de dados composto e tabela tipada:

CREATE TYPE employee_type AS (name text, salary numeric);

CREATE TABLE employees OF employee_type (
    PRIMARY KEY (name),
    salary WITH OPTIONS DEFAULT 1000
);

Criação de tabela particionada por intervalo:

CREATE TABLE measurement (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

Criação de tabela particionada por intervalo, com várias colunas na chave de partição:

CREATE TABLE measurement_year_month (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));

Criação de tabela particionada por lista:

CREATE TABLE cities (
    city_id      bigserial not null,
    name         text not null,
    population   bigint
) PARTITION BY LIST (left(lower(name), 1));

Criação de tabela particionada por hash:

CREATE TABLE orders (
    order_id     bigint not null,
    cust_id      bigint not null,
    status       text
) PARTITION BY HASH (order_id);

Criação de partição de tabela particionada por intervalo:

CREATE TABLE measurement_y2016m07
    PARTITION OF measurement (
    unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Criação de algumas partições de uma tabela particionada por intervalo com várias colunas na chave de partição:

CREATE TABLE measurement_ym_older
    PARTITION OF measurement_year_month
    FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);

CREATE TABLE measurement_ym_y2016m11
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 11) TO (2016, 12);

CREATE TABLE measurement_ym_y2016m12
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 12) TO (2017, 01);

CREATE TABLE measurement_ym_y2017m01
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2017, 01) TO (2017, 02);

Criação de partição de uma tabela particionada por lista:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');

Criação de partição de uma tabela particionada por lista, particionada ainda mais e, em seguida, adicionada uma partição a ela:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);

CREATE TABLE cities_ab_10000_to_100000
    PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);

Criação de partições de tabela particionada por hash:

CREATE TABLE orders_p1 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Criação da partição padrão:

CREATE TABLE cities_partdef
    PARTITION OF cities DEFAULT;

Conformidade

O comando CREATE TABLE está em conformidade com o padrão SQL, com as exceções listadas abaixo.

Tabelas temporárias

Embora a sintaxe de CREATE TEMPORARY TABLE seja semelhante à do padrão SQL, o efeito não é o mesmo. No padrão, as tabelas temporárias são definidas apenas uma vez, existindo automaticamente (começando com conteúdos vazios) em cada sessão que precise delas. Em vez disso, o PostgreSQL requer que cada sessão execute seu próprio comando CREATE TEMPORARY TABLE para cada tabela temporária a ser usada. Isto permite que sessões diferentes usem o mesmo nome de tabela temporária para propósitos diferentes, enquanto a abordagem do padrão restringe todas as instâncias de um determinado nome de tabela temporária a ter a mesma estrutura de tabela.

A definição do comportamento de tabelas temporárias do padrão é amplamente ignorada. Neste ponto, o comportamento do PostgreSQL é semelhante ao de vários outros bancos de dados SQL.

O padrão SQL também faz distinção entre tabelas temporárias globais e locais, onde a tabela temporária local possui um conjunto separado de conteúdos para cada módulo SQL dentro de cada sessão, embora sua definição ainda seja compartilhada entre as sessões. Uma vez que o PostgreSQL não oferece suporte a módulos SQL, esta distinção não é relevante no PostgreSQL.

Para fins de compatibilidade, o PostgreSQL aceita as palavras-chave GLOBAL e LOCAL na declaração de tabela temporária, mas no momento elas não têm efeito. O uso dessas palavras-chave é desencorajado, porque versões futuras do PostgreSQL podem adotar uma interpretação de seu significado mais compatível com o padrão.

A cláusula ON COMMIT para tabelas temporárias também se assemelha ao padrão SQL, mas tem algumas diferenças. Se a cláusula ON COMMIT for omitida, o padrão SQL especifica que o comportamento padrão é ON COMMIT DELETE ROWS. Entretanto, no PostgreSQL o comportamento padrão é ON COMMIT PRESERVE ROWS. A opção ON COMMIT DROP não existe no padrão SQL.

Restrições de unicidade não postergáveis

Quando a restrição UNIQUE ou PRIMARY KEY não é postergável, o PostgreSQL verifica a unicidade imediatamente sempre que uma linha é inserida ou modificada. O padrão SQL diz que a unicidade deve ser aplicada apenas no final da instrução; isto faz diferença quando, por exemplo, um único comando atualiza vários valores de chave. Para obter o comportamento compatível com o padrão, a restrição deve ser declarada como DEFERRABLE, mas não postergada (ou seja, INITIALLY IMMEDIATE). Note que isto pode ser muito mais lento do que a verificação de unicidade imediata.

Restrições de verificação de coluna

O padrão SQL diz que as restrições de coluna CHECK só podem se referir à coluna à qual se aplicam; apenas restrições CHECK de tabela podem se referir a várias colunas. O PostgreSQL não impõe esta restrição; as restrições de verificação de coluna e de tabela são tratadas da mesma forma.

Restrição EXCLUDE

O tipo de restrição EXCLUDE é uma extensão do PostgreSQL.

Restrições de chave estrangeira

A capacidade de especificar listas de colunas nas ações de chave estrangeira SET DEFAULT e SET NULL é uma extensão do PostgreSQL.

É uma extensão do PostgreSQL permitir que uma restrição de chave estrangeira faça referência a colunas de um índice de unicidade em vez de colunas de uma chave primária ou restrição de unicidade.

Restrição NULL

A restrição NULL (na verdade, uma não-restrição) é uma extensão do PostgreSQL ao padrão SQL, incluída para manter a compatibilidade com alguns outros sistemas de banco de dados (e para simetria com a restrição NOT NULL). Como é o padrão para qualquer coluna, sua presença é simplesmente ruído.

Nome de restrição

O padrão SQL diz que as restrições de tabela e de domínio devem ter nomes únicos no esquema que contém a tabela ou domínio. O PostgreSQL é mais flexível: requer apenas que os nomes de restrição sejam únicos entre as restrições anexadas a uma tabela ou domínio específico. Entretanto, esta liberdade extra não existe para restrições baseadas em índice (restrições UNIQUE, PRIMARY KEY, e EXCLUDE), porque o índice associado tem o mesmo nome da restrição, e os nomes dos índices devem ser únicos em todas as relações dentro do mesmo esquema.

Herança

A herança múltipla por meio da cláusula INHERITS é uma extensão à linguagem do PostgreSQL. O SQL:1999 e posteriores definem herança única usando sintaxe e semântica diferentes. A herança ao estilo SQL:1999 ainda não tem suporte no PostgreSQL.

Tabelas sem colunas

O PostgreSQL permite ser criada tabela sem colunas (por exemplo, CREATE TABLE foo();). Esta é uma extensão ao padrão SQL, que não permite tabelas zero-colunas. As tabelas zero-colunas não são muito úteis em si mesmas, mas desativá-las criaria casos especiais estranhos para o comando ALTER TABLE DROP COLUMN, então parece mais fácil ignorar esta restrição da especificação.

Múltiplas colunas de identidade

O PostgreSQL permite que a tabela tenha mais de uma coluna de identidade. O padrão especifica que uma tabela pode ter no máximo uma coluna de identidade. Isto é afrouxado principalmente para dar mais flexibilidade para fazer alterações ou migrações de esquema. Note que o comando INSERT suporta apenas uma cláusula de substituição que se aplica a toda a instrução, portanto, ter várias colunas de identidade com comportamentos diferentes não é bem suportado.

Colunas geradas

As opções STORED e VIRTUAL não fazem parte do padrão, mas também são usadas ​​por outras implementações de SQL. O padrão SQL não especifica o armazenamento de colunas geradas.

Cláusula LIKE

Embora exista a cláusula LIKE no padrão SQL, muitas das opções que o PostgreSQL aceita não fazem parte do padrão, e algumas das opções do padrão não são implementadas pelo PostgreSQL.

Cláusula WITH

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

Espaços de tabelas

O conceito de espaço de tabelas do PostgreSQL não faz parte do padrão. Portanto, as cláusulas TABLESPACE e USING INDEX TABLESPACE são extensões.

Tabelas tipadas

As tabelas tipadas implementam um subconjunto do padrão SQL. Segundo o padrão, uma tabela tipada possui colunas correspondentes ao tipo de dados composto subjacente, bem como a uma outra coluna que é a coluna autorreferenciada. O PostgreSQL não oferece suporte a colunas autorreferenciadas explicitamente.

Cláusula PARTITION BY

A cláusula PARTITION BY é uma extensão do PostgreSQL.

Cláusula PARTITION OF

A cláusula PARTITION OF é uma extensão do PostgreSQL.

Veja também

ALTER TABLE, DROP TABLE, CREATE TABLE AS, CREATE TABLESPACE, CREATE TYPE, pg_tables


[139] O comando CREATE TABLE define uma tabela. A definição deve incluir seu nome e os nomes e atributos de suas colunas. A definição pode incluir outros atributos da tabela, como sua chave primária ou restrições de verificação. IBM DB2 12.1.x – CREATE TABLE statement (N. T.)