CREATE TABLE — define uma nova tabela
CREATEtipo_de_tabelaTABLE [ IF NOT EXISTS ]nome_da_tabela( [ {nome_da_colunatipo_de_dados[ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSIONmétodo_de_compressão] [ COLLATEordenação] [restrição_de_coluna[ ... ] ] |restrição_de_tabela| LIKEtabela_de_origem[opção_do_LIKE... ] } [, ... ] ] ) [ INHERITS (tabela_mãe[, ... ] ) ] [ PARTITION BY { RANGE | LIST | HASH } ( {nome_da_coluna| (expressão) } [ COLLATEordenação] [classe_de_operador] [, ... ] ) ] [ USINGmétodo] [ WITH (parâmetro_de_armazenamento[=valor] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEnome_do_espaço_de_tabelas] CREATEtipo_de_tabelaTABLE [ IF NOT EXISTS ]nome_da_tabelaOFnome_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) } [ COLLATEordenação] [classe_de_operador] [, ... ] ) ] [ USINGmétodo] [ WITH (parâmetro_de_armazenamento[=valor] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEnome_do_espaço_de_tabelas] CREATEtipo_de_tabelaTABLE [ IF NOT EXISTS ]nome_da_tabelaPARTITION OFtabela_mãe[ ( {nome_da_coluna[ WITH OPTIONS ] [restrição_de_coluna[ ... ] ] |restrição_de_tabela} [, ... ] ) ] { FOR VALUESespecificação_de_limite_de_partição| DEFAULT } [ PARTITION BY { RANGE | LIST | HASH } ( {nome_da_coluna| (expressão) } [ COLLATEordenação] [classe_de_operador] [, ... ] ) ] [ USINGmétodo] [ WITH (parâmetro_de_armazenamento[=valor] [, ... ] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACEnome_do_espaço_de_tabelas] ondetipo_de_tabelapode ser: [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] erestrição_de_colunaé: [ CONSTRAINTnome_da_restrição] { NOT NULL [ NO INHERIT ] | NULL | CHECK (expressão) [ NO INHERIT ] | DEFAULTexpressã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 KEYparâmetros_de_índice| REFERENCEStabela_referenciada[ (coluna_referenciada) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEação_referencial] [ ON UPDATEação_referencial] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] erestrição_de_tabelaé: [ CONSTRAINTnome_da_restrição] { CHECK (expressão) [ NO INHERIT ] | NOT NULLnome_da_coluna[ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] (nome_da_coluna[, ... ] [,nome_da_colunaWITHOUT OVERLAPS ] )parâmetros_de_índice| PRIMARY KEY (nome_da_coluna[, ... ] [,nome_da_colunaWITHOUT OVERLAPS ] )parâmetros_de_índice| EXCLUDE [ USINGmétodo_de_índice] (elemento_excluídoWITHoperador[, ... ] )parâmetros_de_índice[ WHERE (predicado) ] | FOREIGN KEY (nome_da_coluna[, ... ] [, PERIODnome_da_coluna] ) REFERENCEStabela_referenciada[ (coluna_referenciada[, ... ] [, PERIODcoluna_referenciada] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEação_referencial] [ ON UPDATEação_referencial] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] eopção_do_LIKEé: { INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL } eespecificaçã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 ( MODULUSliteral_numérico, REMAINDERliteral_numérico) eparâmetros_de_índicenas restriçõesUNIQUE,PRIMARY KEYeEXCLUDEsão: [ INCLUDE (nome_da_coluna[, ... ] ) ] [ WITH (parâmetro_de_armazenamento[=valor] [, ... ] ) ] [ USING INDEX TABLESPACEnome_do_espaço_de_tabelas] eelemento_excluídoem uma restriçãoEXCLUDEé: {nome_da_coluna| (expressão) } [ COLLATEordenação] [classe_de_operador[ (opclass_parameter=valor[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] eação_referencialem uma restriçãoFOREIGN KEY/REFERENCESé: { NO ACTION | RESTRICT | CASCADE | SET NULL [ (nome_da_coluna[, ... ] ) ] | SET DEFAULT [ (nome_da_coluna[, ... ] ) ] }
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.
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ênciaLOGGED 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.
DEFERRABLENOT 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 IMMEDIATEINITIALLY 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.
ENFORCEDNOT 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.
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.
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.)
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;
O comando CREATE TABLE está em conformidade com o
padrão SQL, com as exceções listadas abaixo.
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.
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.
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.
EXCLUDE
O tipo de restrição EXCLUDE é uma extensão do
PostgreSQL.
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.
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.
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.
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.
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.
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.
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.
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.
WITH
A cláusula WITH é uma extensão do
PostgreSQL;
os parâmetros de armazenamento não fazem parte no padrão.
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.
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.
PARTITION BY
A cláusula PARTITION BY é uma extensão do
PostgreSQL.
PARTITION OF
A cláusula PARTITION OF é uma extensão do
PostgreSQL.
[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.)