ALTER TABLE — modifica a definição de uma tabela
ALTER TABLE [ IF EXISTS ] [ ONLY ]nome_da_tabela[ * ]ação[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]nome_da_tabela[ * ] RENAME [ COLUMN ]nome_da_colunaTOnovo_nome_da_colunaALTER TABLE [ IF EXISTS ] [ ONLY ]nome_da_tabela[ * ] RENAME CONSTRAINTnome_da_restriçãoTOnovo_nome_da_restriçãoALTER TABLE [ IF EXISTS ]nome_da_tabelaRENAME TOnovo_nomeALTER TABLE [ IF EXISTS ]nome_da_tabelaSET SCHEMAnovo_esquemaALTER TABLE ALL IN TABLESPACEnome_do_espaço_de_tabelas [ OWNED BYnome_da_role[, ... ] ] SET TABLESPACEnovo_espaço_de_tabelas[ NOWAIT ] ALTER TABLE [ IF EXISTS ]nome_da_tabelaATTACH PARTITIONnome_da_partição { FOR VALUESespecificação_de_limite_de_partição| DEFAULT } ALTER TABLE [ IF EXISTS ]nome_da_tabelaDETACH PARTITIONnome_da_partição[ CONCURRENTLY | FINALIZE ] ondeaçãoé uma entre: ADD [ COLUMN ] [ IF NOT EXISTS ]nome_da_colunatipo_de_dados [ COLLATEordenação] [restrição_de_coluna[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]nome_da_coluna [ RESTRICT | CASCADE ] ALTER [ COLUMN ]nome_da_coluna [ SET DATA ] TYPEtipo_de_dados [ COLLATEordenação] [ USINGexpressão] ALTER [ COLUMN ]nome_da_coluna SET DEFAULTexpressãoALTER [ COLUMN ]nome_da_coluna DROP DEFAULT ALTER [ COLUMN ]nome_da_coluna { SET | DROP } NOT NULL ALTER [ COLUMN ]nome_da_coluna SET EXPRESSION AS (expressão) ALTER [ COLUMN ]nome_da_coluna DROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ]nome_da_coluna ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (opções_da_sequência) ] ALTER [ COLUMN ]nome_da_coluna { SET GENERATED { ALWAYS | BY DEFAULT } | SETopção_de_sequência| RESTART [ [ WITH ]reinício] } [...] ALTER [ COLUMN ]nome_da_coluna DROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]nome_da_coluna SET STATISTICS {inteiro| DEFAULT } ALTER [ COLUMN ]nome_da_coluna SET (opção_de_atributo=valor[, ... ] ) ALTER [ COLUMN ]nome_da_coluna RESET (opção_de_atributo[, ... ] ) ALTER [ COLUMN ]nome_da_coluna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]nome_da_coluna SET COMPRESSIONmétodo_de_compressãoADDrestrição_de_tabela[ NOT VALID ] ADDrestrição_de_tabela_usando_índiceALTER CONSTRAINTnome_da_restrição [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ] ALTER CONSTRAINTnome_da_restrição [ INHERIT | NO INHERIT ] VALIDATE CONSTRAINTnome_da_restriçãoDROP CONSTRAINT [ IF EXISTS ]nome_da_restrição [ RESTRICT | CASCADE ] DISABLE TRIGGER [nome_do_gatilho| ALL | USER ] ENABLE TRIGGER [nome_do_gatilho| ALL | USER ] ENABLE REPLICA TRIGGERnome_do_gatilhoENABLE ALWAYS TRIGGERnome_do_gatilhoDISABLE RULEnome_da_regra_de_reescritaENABLE RULEnome_da_regra_de_reescritaENABLE REPLICA RULEnome_da_regra_de_reescritaENABLE ALWAYS RULEnome_da_regra_de_reescritaDISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ONnome_do_índiceSET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHOD {novo_método_de_acesso| DEFAULT } SET TABLESPACEnovo_espaço_de_tabelasSET { LOGGED | UNLOGGED } SET (parâmetro_de_armazenamento[=valor] [, ... ] ) RESET (parâmetro_de_armazenamento[, ... ] ) INHERITtabela_mãeNO INHERITtabela_mãeOFnome_do_tipo_de_dadosNOT OF OWNER TO {novo_dono| CURRENT_ROLE | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEXnome_do_índice| FULL | NOTHING } eespecificação_de_limite_de_partiçãoé: IN (partition_bound_expr[, ...] ) | FROM ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSliteral_numérico, REMAINDERliteral_numérico) 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 ] erestrição_de_tabela_usando_índiceé: [ CONSTRAINTnome_da_restrição] { UNIQUE | PRIMARY KEY } USING INDEXnome_do_índice[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] osparâ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] oelemento_excluídoem uma restriçãoEXCLUDEé: {nome_da_coluna| (expressão) } [ COLLATEordenação] [classe_de_operador [ (parâmetro_de_classe_de_operador=valor [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] aação_referencialem uma restriçãoFOREIGN KEY/REFERENCESé: { NO ACTION | RESTRICT | CASCADE | SET NULL [ (nome_da_coluna[, ... ] ) ] | SET DEFAULT [ (nome_da_coluna[, ... ] ) ] }
O comando ALTER TABLE altera a definição de uma
tabela existente.
Existem várias subformas descritas abaixo.
Note que o nível de bloqueio necessário pode ser diferente para
cada subforma.
É adquirido um bloqueio ACCESS EXCLUSIVE,
a menos que algum outro esteja explicitamente indicado.
Quando são emitidos vários subcomandos, o bloqueio adquirido será
o mais estrito exigido por qualquer subcomando.
ADD COLUMN [ IF NOT EXISTS ] #
Esta forma adiciona uma nova coluna à tabela, usando a mesma
sintaxe de CREATE TABLE.
Se for especificado IF NOT EXISTS, e já existir
uma coluna com este nome, não será relatado nenhum erro.
DROP COLUMN [ IF EXISTS ] #
Esta forma exclui uma coluna da tabela sendo alterada.
Os índices e restrições de tabela envolvendo a coluna também são
excluídos automaticamente.
As estatísticas multivariadas que fazem referência à coluna
excluída também são removidas, se a exclusão da coluna fizer com
que as estatísticas contenham dados para apenas uma única coluna.
É necessário especificar CASCADE, se algo fora
da tabela depender da coluna, por exemplo, referências de chaves
estrangeiras ou visões.
Se for especificado IF EXISTS, e a coluna não
existir, não será relatado nenhum erro.
É emitido um aviso neste caso.
SET DATA TYPE #
Esta forma altera o tipo de dados de uma coluna da tabela.
Os índices e restrições de tabela simples que envolvem a coluna
são convertidos automaticamente para usar o novo tipo de dados
da coluna, reanalisando a expressão fornecida originalmente.
A cláusula opcional COLLATE especifica uma
ordenação para a coluna alterada; se omitida, a ordenação será a
ordenação padrão para o novo tipo de dados da coluna.
A cláusula opcional USING especifica como
calcular o novo valor da coluna a partir do valor antigo;
se omitida, a conversão padrão é a mesma que a de uma atribuição
do tipo de dados antigo para o tipo de dados novo.
Deve ser fornecida a cláusula USING, caso não
haja conversão ou atribuição implícita do tipo de dados antigo
para o tipo de dados novo.
Quando esta forma é usada, as estatísticas da coluna são removidas,
portanto, recomenda-se executar posteriormente o comando
ANALYZE na tabela.
Para uma coluna virtual gerada, o comando ANALYZE
não é necessário, porque estas colunas nunca possuem estatísticas.
SET/DROP DEFAULT #
Estas formas definem ou removem o valor padrão da coluna
(onde remover é equivalente a definir o valor padrão como
NULL).
O novo valor padrão é aplicado apenas nos comandos
INSERT e UPDATE posteriores;
não causa alterações nas linhas que já estão na tabela.
SET/DROP NOT NULL #Estas formas alteram se a coluna está definida para permitir valores nulos, ou para rejeitar valores nulos.
SET NOT NULL só pode ser aplicado a uma coluna
se nenhum dos registros na tabela contiver um valor
NULL para esta coluna.
Normalmente, isto é verificado durante o comando
ALTER TABLE, examinando a tabela inteira,
a menos que seja especificado NOT VALID;
entretanto, se existir uma restrição CHECK
válida (e ela não for removida no mesmo comando) que prove que
nenhum valor NULL possa existir, a varredura
da tabela poderá ser ignorada.
Se uma coluna tiver uma restrição de não-nulo inválida,
SET NOT NULL a validará.
Se esta tabela for uma partição, não se pode executar
DROP NOT NULL em uma coluna se ela estiver
definida como NOT NULL na tabela mãe.
Para remover a restrição NOT NULL de todas as
partições, deve ser executado DROP NOT NULL
na tabela mãe.
Mesmo não havendo nenhuma restrição NOT NULL
na tabela mãe, esta restrição ainda assim pode ser adicionada
a partições individuais, se desejado; ou seja, as tabelas filhas
podem proibir valores nulos, mesmo que a tabela mãe os permita,
mas não o contrário.
Também é possível remover a restrição NOT NULL
apenas na tabela mãe, o que não a remove das tabelas filhas.
SET EXPRESSION AS #Esta forma substitui a expressão de uma coluna gerada. Os dados existentes em uma coluna gerada e armazenada são reescritos e todas as alterações futuras aplicarão a nova expressão de geração.
Quando esta forma é usada em uma coluna gerada e armazenada,
suas estatísticas são removidas; portanto, recomenda-se executar
posteriormente o comando ANALYZE na tabela.
Para uma coluna virtual gerada, o comando ANALYZE
não é necessário, porque estas colunas nunca possuem estatísticas.
DROP EXPRESSION [ IF EXISTS ] #Esta forma transforma uma coluna gerada armazenada em uma coluna base normal. Os dados existentes nas colunas são mantidos, mas as alterações futuras não vão mais aplicar a expressão de geração.
Esta forma é atualmente compatível apenas com colunas geradas e armazenadas (não com colunas virtuais).
Se for especificado DROP EXPRESSION IF EXISTS
e se a coluna não for uma coluna gerada, nenhum erro será relatado.
Neste caso, é emitida uma notificação.
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITYSET GENERATED { ALWAYS | BY DEFAULT }DROP IDENTITY [ IF EXISTS ] #
Estas formas alteram se a coluna é uma coluna de identidade, ou
alteram o atributo de geração de uma coluna de identidade existente.
Veja CREATE TABLE para obter detalhes.
Como SET DEFAULT, estas formas afetam apenas
o comportamento dos comandos INSERT e
UPDATE posteriores;
não causam alterações nas linhas já existentes na tabela.
Se for especificado DROP IDENTITY IF EXISTS
e se a coluna não for uma coluna de identidade, nenhum erro será
relatado.
Neste caso, é emitida uma notificação.
SET opção_de_sequênciaRESTART #
Estas formas alteram a sequência subjacente a uma coluna de
identidade existente.
A opção_de_sequência é uma opção
com suporte pelo comando ALTER SEQUENCE,
tal como INCREMENT BY.
SET STATISTICS #
Esta forma define o quantitativo da coleta de estatísticas por
coluna para as operações ANALYZE posteriores.
O alvo pode ser definido no intervalo de 0 a 10000.
Defina como DEFAULT para voltar a usar o alvo
de estatísticas padrão do sistema.
(Atribuir o valor -1 é uma forma obsoleta de obter o mesmo resultado.)
Para obter mais informações sobre o uso de estatísticas pelo
planejador de consultas do PostgreSQL
veja Estatísticas usadas pelo planejador.
SET STATISTICS adquire um bloqueio
SHARE UPDATE EXCLUSIVE.
SET ( opção_de_atributo = valor [, ... ] )RESET ( opção_de_atributo [, ... ] ) #
Esta forma define ou redefine as opções por atributo.
Atualmente, as únicas opções definidas por atributo são
n_distinct e
n_distinct_inherited, que sobrescrevem as
estimativas do número de valores distintos feitas por operações
posteriores do comando ANALYZE.
n_distinct afeta as estatísticas da própria
tabela, enquanto n_distinct_inherited afeta as
estatísticas coletadas para a tabela mais suas filhas de herança,
e para as estatísticas coletadas para tabelas particionadas.
Quando o valor especificado for positivo, o planejador de consultas
irá assumir que a coluna contém exatamente o número especificado de
valores distintos não nulos.
Também podem ser especificados valores fracionários usando valores
menores que 0 e maiores ou iguais a -1.
Isto instrui o planejador de consultas a estimar o número de valores
distintos multiplicando o valor absoluto do número especificado
pelo número estimado de linhas na tabela.
Por exemplo, um valor de -1 implica que todos os valores na coluna
são distintos, enquanto um valor de -0,5 implica que cada valor
aparece duas vezes em média.
Isto pode ser útil quando o tamanho da tabela muda ao longo do tempo.
Para obter mais informações sobre o uso de estatísticas pelo
planejador de consultas do PostgreSQL,
veja Estatísticas usadas pelo planejador.
A alteração das opções por atributo adquire um bloqueio
SHARE UPDATE EXCLUSIVE.
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
#
Esta forma define o modo de armazenamento para uma coluna.
Controla se esta coluna é mantida em linha ou em uma tabela
TOAST secundária, e se os dados devem ser
comprimidos ou não.
PLAIN deve ser usado para valores de comprimento
fixo, tal como integer, e é mantido em linha, sem
compressão.
MAIN é para dados em linha e comprimíveis.
EXTERNAL é para dados externos e não comprimidos,
e EXTENDED é para dados externos e 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 que suportam armazenamento não-PLAIN.
O uso de EXTERNAL fará com que as operações de
sub-cadeias de caracteres em valores muito grandes dos tipos de
dados text e bytea sejam executadas
mais rapidamente.
Note que ALTER TABLE ... SET STORAGE não muda
nada na tabela; apenas define a estratégia a ser perseguida
durante as futuras atualizações da tabela.
Veja TOAST para obter mais informações.
SET COMPRESSION método_de_compressão
#
Esta forma define o método de compressão para a coluna,
determinando como os valores inseridos no futuro serão comprimidos
(se o modo de armazenamento permitir compressão).
Não faz com que a tabela seja reescrita, portanto, os dados
existentes ainda podem estar comprimidos com outros métodos de
compressão.
Se a tabela for recuperada usando
pg_restore, então todos os valores
serão reescritos com o método de compressão configurado.
Entretanto, quando os dados são inseridos a partir de outra relação
(por exemplo, por INSERT ... SELECT), os
valores da tabela de origem não são necessariamente expandidos,
portanto, quaisquer dados comprimidos anteriormente podem manter
seu método de compressão existente, em vez de serem comprimidos
novamente com o método de compressão da coluna de destino.
Os métodos de compressão com suporte são pglz e
lz4.
(lz4 está disponível apenas se foi usada
a opção --with-lz4 ao construir o
PostgreSQL.)
Além desses, o
método_de_compressão
pode ser default, que seleciona o comportamento
padrão de consultar a configuração
default_toast_compression no momento
da inserção de dados, para determinar o método a ser usado.
ADD restrição_de_tabela [ NOT VALID ] #
Esta forma adiciona uma nova restrição à tabela usando a mesma
sintaxe de restrição de CREATE TABLE,
mais a opção NOT VALID, que é atualmente
permitida apenas para chaves estrangeiras e restrições de não-nulo.
Normalmente, esta forma faz uma verificação da tabela para
verificar se todas as linhas existentes atendem à nova restrição.
Mas se for usada a opção NOT VALID, esta
verificação potencialmente demorada será ignorada.
A restrição ainda assim será aplicada em inserções ou
atualizações posteriores (ou seja, vão falhar a menos que haja
uma linha correspondente na tabela referenciada, no caso de
chaves estrangeiras, ou a menos que a nova linha
corresponda à condição verificação especificada).
Mas o banco de dados não vai assumir que a restrição vale para
todas as linhas da tabela, até que seja validada usando a opção
VALIDATE CONSTRAINT.
Veja Notes abaixo para obter mais
informações sobre como usar a opção NOT VALID.
Embora a maioria das formas de
ADD
requeira um bloqueio restrição_de_tabelaACCESS EXCLUSIVE,
ADD FOREIGN KEY requer apenas um bloqueio
SHARE ROW EXCLUSIVE.
Note que ADD FOREIGN KEY também adquire um
bloqueio SHARE ROW EXCLUSIVE na tabela
referenciada, além do bloqueio na tabela onde a restrição é
declarada.
Condições suplementares são aplicadas quando são adicionadas restrições de unicidade, ou de chave primária, a tabelas particionadas; veja CREATE TABLE.
ADD restrição_de_tabela_usando_índice #
Esta forma adiciona uma nova restrição
PRIMARY KEY ou UNIQUE
a uma tabela, baseada em um índice de unicidade existente.
Todas as colunas do índice são incluídas na restrição.
O índice não pode ter colunas de expressão nem ser um índice
parcial e, além disso, deve ser um índice de Árvore-B com
ordem de classificação padrão.
Estas restrições garantem que o índice seja equivalente ao que
seria construído por um comando ADD PRIMARY KEY
ou ADD UNIQUE regular.
Se for especificado PRIMARY KEY, e as colunas
do índice não estiverem definidas como NOT NULL,
então este comando tentará executar
ALTER COLUMN SET NOT NULL em todas estas colunas.
Isto requer a varredura de toda a tabela para verificar
se as colunas não contêm nulos.
Em todos os outros casos, esta é uma operação rápida.
Se for fornecido um nome de restrição, o índice será renomeado para corresponder ao nome da restrição. Caso contrário, a restrição terá o mesmo nome do índice.
Após este comando ser executado, o índice passará a pertencer à
restrição, da mesma maneira que se o índice tivesse sido
construído por um comando ADD PRIMARY KEY
ou ADD UNIQUE regular.
Em particular, excluir a restrição fará com que o índice também
desapareça.
No momento, esta forma não tem suporte em tabelas particionadas.
Adicionar uma restrição usando um índice existente pode ser útil
em situações em que uma nova restrição precisa ser adicionada
sem bloquear as atualizações da tabela por um longo tempo.
Para fazer isto, crie o índice usando
CREATE UNIQUE INDEX CONCURRENTLY, e depois
converta em uma restrição usando esta sintaxe.
Veja o exemplo abaixo.
ALTER CONSTRAINT #Esta forma altera os atributos de uma restrição criada anteriormente. No momento, apenas as restrições de chave estrangeira podem ser alteradas desta maneira, mas veja abaixo.
ALTER CONSTRAINT ... INHERITALTER CONSTRAINT ... NO INHERIT #Estas formas modificam uma restrição herdável, de modo que ela deixe de ser herdável, ou vice-versa. Atualmente, apenas as restrições de não nulo podem ser alteradas desta forma. Além de alterar a herdabilidade da restrição, no caso de uma restrição não herdável ser marcada como herdável, se a tabela tiver tabelas filhas, uma restrição equivalente será adicionada a elas. Se uma restrição herdável for marcada como não herdável em uma tabela com filhas, a restrição correspondente nas filhas será marcada como não herdável, mas não será removida.
VALIDATE CONSTRAINT #
Esta forma valida uma restrição de chave estrangeira,
de verificação ou de não-nulo que foi previamente criada como
NOT VALID, varrendo a tabela para garantir que
não haja linhas para as quais a restrição não seja satisfeita.
Se a restrição foi definida como NOT ENFORCED,
será lançado um erro.
Nada acontecerá se a restrição já estiver marcada como válida.
(Veja Notes abaixo, para obter
uma explicação da utilidade deste comando.)
Este comando adquire um bloqueio
SHARE UPDATE EXCLUSIVE.
DROP CONSTRAINT [ IF EXISTS ] #
Esta forma exclui da tabela a restrição especificada,
e também qualquer índice subjacente à restrição.
Se for especificado IF EXISTS, e a restrição
não existir, não será relatado nenhum erro.
É emitido um aviso neste caso.
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER #Estas formas configuram o disparo do(s) gatilhos(s) pertencente(s) à tabela. Um gatilho desativado ainda é reconhecido pelo sistema, mas não é executado quando o evento que o aciona ocorre. (Para um gatilho postergado, o status de ativo é verificado quando o evento ocorre, e não quando a função do gatilho é efetivamente executada.) É possível desativar ou ativar um único gatilho especificado pelo seu nome, todos os gatilhos da tabela ou apenas os gatilhos do usuário (esta opção exclui os gatilhos de restrição gerados internamente, como aqueles usados para implementar restrições de chave estrangeira ou restrições de unicidade e exclusão postergáveis). Desativar ou ativar gatilhos de restrição gerados internamente requer privilégios de superusuário; isto deve ser feito com cautela, porque, obviamente, a integridade da restrição não poderá ser garantida se os gatilhos não forem executados.
O mecanismo de disparo do gatilho também é afetado pela variável
de configuração session_replication_role.
Gatilhos simplesmente ativados (o padrão) serão acionados quando
a função de replicação for “origem” (o padrão) ou
“local”.
Os gatilhos configurados como ENABLE REPLICA só
serão disparados se a sessão estiver no modo “replica”,
e os gatilhos configurados como ENABLE ALWAYS
serão disparados independentemente da função de replicação corrente.
O efeito deste mecanismo é que, na configuração padrão, os gatilhos
não são disparados nas réplicas.
Isto é útil, porque se um gatilho for usado na origem para propagar
dados entre tabelas, o sistema de replicação também replicará os
dados propagados; então o gatilho não deve disparar uma segunda
vez na réplica, porque isto levaria à duplicação.
Entretanto, se o gatilho for usado para outra finalidade,
tal como criar alertas externos, pode ser apropriado configurá-lo
como ENABLE ALWAYS, para que também seja
disparado nas réplicas.
Quando este comando é aplicado a uma tabela particionada, os
estados dos gatilhos de clonagem correspondentes nas partições
também são atualizados, a menos que seja especificado
ONLY.
Este comando adquire um bloqueio
SHARE ROW EXCLUSIVE.
DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE #
Estas formas configuram o disparo de regras de reescrita
pertencentes à tabela.
Uma regra desativada ainda é reconhecida pelo sistema, mas não é
aplicada durante a reescrita da consulta.
A semântica é como para gatilhos desativados/ativados.
Esta configuração é ignorada para as regras
ON SELECT, que são sempre aplicadas para manter
as visões funcionando, mesmo se a sessão corrente estiver em uma
função de replicação não padrão.
O mecanismo de disparo da regra também é afetado pela variável de configuração session_replication_role, semelhante aos gatilhos descritos acima.
DISABLE/ENABLE ROW LEVEL SECURITY #Estas formas controlam a aplicação de políticas de segurança de linha pertencentes à tabela. Se ativado, e não existir nenhuma política para a tabela, a política de negação padrão será aplicada. Note que podem existir políticas para uma tabela, mesmo se a segurança no nível de linha estiver desativada. Neste caso, as políticas não serão aplicadas, sendo ignoradas. Veja também CREATE POLICY.
NO FORCE/FORCE ROW LEVEL SECURITY #Estas formas controlam a aplicação de políticas de segurança de linha pertencentes à tabela, quando o usuário é o dono da tabela. Se ativado, as políticas de segurança no nível de linha serão aplicadas quando o usuário for o dono da tabela. Se desativado (o padrão), a segurança no nível de linha não será aplicada quando o usuário for o dono da tabela. Veja também CREATE POLICY.
CLUSTER ON #Esta forma seleciona o índice padrão para futuras operações de CLUSTER. Na verdade, não reorganiza a tabela.
Mudar as opções de reorganização adquire um bloqueio
SHARE UPDATE EXCLUSIVE.
SET WITHOUT CLUSTER #Esta forma remove da tabela a especificação de índice de CLUSTER usada mais recentemente. Afeta futuras operações de reorganização que não especificam índice.
Mudar as opções de reorganização adquire um bloqueio
SHARE UPDATE EXCLUSIVE na tabela.
SET WITHOUT OIDS #
Sintaxe compatível com versões anteriores para remover a coluna
do sistema oid.
Como as colunas do sistema oid não podem mais
ser adicionadas, nunca terá efeito.
SET ACCESS METHOD #
Esta forma altera o método de acesso da tabela, reescrevendo-a
usando o método de acesso indicado; especificar
DEFAULT seleciona o método de acesso definido
pelo parâmetro de configuração
default_table_access_method.
Veja Definição da interface do método de acesso à tabela para obter mais informações.
Quando aplicado a uma tabela particionada, não há dados para
reescrever, mas as partições criadas posteriormente usarão
por padrão o método de acesso especificado, a menos que seja
substituído por uma cláusula USING.
Especificar DEFAULT remove o valor anterior,
fazendo com que as partições futuras tenham como valor padrão
default_table_access_method.
SET TABLESPACE #
Esta forma altera o espaço de tabelas da tabela, para o
espaço de tabelas especificado, e move o(s) arquivo(s) de dados
associado(s) à tabela para o novo espaço de tabelas.
Os índices na tabela, se houver, não são movidos; mas podem ser
movidos separadamente com comandos SET TABLESPACE
adicionais.
Quando aplicado a uma tabela particionada, nada é movido, mas
quaisquer partições criadas posteriormente usando
CREATE TABLE PARTITION OF usará este espaço
de tabelas, a menos que seja substituído por uma cláusula
TABLESPACE.
Todas as tabelas em um espaço de tabelas do banco de dados corrente
podem ser movidas usando a forma ALL IN TABLESPACE,
que primeiro bloqueia todas as tabelas a serem movidas,
e depois move cada uma delas.
Esta forma também oferece suporte a OWNED BY,
que move apenas as tabelas pertencentes às funções de banco de
dados (roles) especificadas.
Se for especificada a opção NOWAIT, o comando
falhará se não conseguir obter todos os bloqueios necessários
imediatamente.
Note que os catálogos do sistema não são movidos por este comando;
deve ser usado ALTER DATABASE, ou chamadas
explícitas de ALTER TABLE se desejado.
As relações do information_schema não são
consideradas parte dos catálogos do sistema, e serão movidas.
Veja também CREATE TABLESPACE.
SET { LOGGED | UNLOGGED } #
Esta forma altera a tabela de “com registro de transações”
(LOGGED) para
“sem registro de transações”
(UNLOGGED), e vice-versa
(veja UNLOGGED
e Unlogged).
Não se aplica a tabelas temporárias.
Isto também altera a persistência de quaisquer sequências vinculadas à tabela (para colunas de identidade ou seriais). Entretanto, também é possível alterar a persistência destas sequências separadamente.
Esta forma não dá suporte para tabelas particionadas.
SET ( parâmetro_de_armazenamento [= valor] [, ... ] ) #
Esta forma altera um ou mais parâmetros de armazenamento da tabela.
Veja Parâmetros de armazenamento
na documentação de CREATE TABLE
para obter detalhes sobre os parâmetros disponíveis.
Note que o conteúdo da tabela não será modificado imediatamente
por este comando; dependendo do parâmetro, pode ser necessário
reescrever a tabela para obter os efeitos desejados.
Isto pode ser feito usando VACUUM
(FULL), CLUSTER,
ou uma das formas de ALTER TABLE que força
a reescrita da tabela.
Para parâmetros relacionados ao planejador, as alterações entrarão
em vigor na próxima vez que a tabela for bloqueada, portanto,
as consultas em execução no momento não serão afetadas.
Será adquirido o bloqueio SHARE UPDATE EXCLUSIVE
para os parâmetros de armazenamento fillfactor,
toast e autovacuum, bem como
para o parâmetro do planejador parallel_workers.
RESET ( parâmetro_de_armazenamento [, ... ] ) #
Esta forma redefine um ou mais parâmetros de armazenamento para
seus valores padrão.
Como acontece com SET, pode ser necessária
a reescrita da tabela para atualizá-la completamente.
INHERIT tabela_mãe #Esta forma adiciona a tabela como nova filha da tabela mãe especificada. Em seguida, as consultas à tabela mãe incluirão os registros dessa tabela. Para ser adicionada como filha, a tabela já deve conter todas as mesmas colunas que a tabela mãe (pode ter colunas adicionais também). As colunas devem ter tipos de dados correspondentes
Além disso, todas as restrições CHECK e
NOT NULL na tabela mãe também devem existir na
tabela filha, exceto aquelas marcadas como não herdáveis
(ou seja, criadas com
ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT),
que são ignoradas.
Todas as restrições de tabelas filhas que corresponderem não devem estar marcadas como não herdáveis.
No momento, as restrições UNIQUE,
PRIMARY KEY e FOREIGN KEY
não são consideradas, mas isto poderá mudar no futuro.
NO INHERIT tabela_mãe #Esta forma remove a tabela da lista de filhas da tabela mãe especificada. As consultas na tabela mãe não incluirão mais os registros extraídos dessa tabela.
OF nome_do_tipo_de_dados #
Esta forma liga a tabela a um tipo composto como se tivesse sido
criada por CREATE TABLE OF.
A lista de nomes e tipos de dados das colunas da tabela deve
corresponder precisamente à do tipo composto.
A tabela não deve herdar de nenhuma outra tabela.
Estas restrições garantem que CREATE TABLE OF
permitiria uma definição de tabela equivalente.
NOT OF #Esta forma dissocia uma tabela tipada de seu tipo.
OWNER TO #Esta forma altera o dono da tabela, sequência, visão, visão materializada, ou tabela estrangeira, para o usuário especificado.
REPLICA IDENTITY #Esta forma altera as informações escritas no registro de transações para identificar as linhas atualizadas ou excluídas. Geralmente, o valor antigo de cada coluna só é registrado se for diferente do novo valor; entretanto, se o valor antigo for armazenado externamente, este sempre será registrado, independentemente de ter sido alterado ou não. Esta opção não tem efeito, exceto quando está em uso a replicação lógica.
DEFAULT #
Registra os valores antigos das colunas da chave primária.
Este é o padrão para tabelas que não são do sistema.
Quando não há chave primária, o comportamento é o mesmo que
NOTHING.
USING INDEX nome_do_índice #
Registra os valores antigos das colunas cobertas pelo índice
indicado, que devem ser únicos, não parciais, não postergáveis,
e incluir apenas colunas marcadas como NOT NULL.
Se este índice for excluído, o comportamento será o mesmo que
NOTHING.
FULL #Registra os valores antigos de todas as colunas na linha.
NOTHING #Não registra nenhuma informação sobre a linha antiga. Este é o padrão para as tabelas do sistema.
RENAME #
A forma RENAME altera o nome da tabela
(ou índice, sequência, visão, visão materializada, ou tabela
estrangeira), o nome de uma coluna individual na tabela,
ou o nome de uma restrição da tabela.
Ao renomear uma restrição que possui um índice subjacente,
o índice também é renomeado.
Não há efeito sobre os dados armazenados.
SET SCHEMA #Esta forma move a tabela para outro esquema. Os índices associados, restrições e sequências pertencentes às colunas da tabela também são movidos.
ATTACH PARTITION nome_da_partição { FOR VALUES especificação_de_limite_de_partição | DEFAULT } #
Esta forma anexa uma tabela existente (que pode ser particionada)
como partição da tabela e destino.
A tabela pode ser anexada como uma partição para valores
específicos usando FOR VALUES, ou como uma
partição padrão usando DEFAULT.
Para cada índice da tabela de destino, será criado um índice
correspondente na tabela anexada; ou, se já existir um índice
equivalente, este será anexado ao índice da tabela de destino,
como tivesse sido executado
ALTER INDEX ATTACH PARTITION.
Note que se a tabela existente for uma tabela externa,
atualmente não é permitido anexar a tabela como uma partição da
tabela de destino se houver índices UNIQUE
na tabela de destino.
(Veja também CREATE FOREIGN TABLE.)
Para cada gatilho no nível de linha definido pelo usuário existente
na tabela de destino, é criado um gatilho correspondente na tabela
anexada.
Uma partição que usa FOR VALUES usa a mesma sintaxe para
especificação_de_limite_de_partição
que o comando CREATE TABLE.
A especificação de limite de partição deve corresponder à estratégia
de particionamento e à chave de partição da tabela alvo.
A tabela a ser anexada deve ter exatamente as mesmas colunas que
a tabela de alvo, sem nenhuma outra; além disso, os tipos de dados
das colunas também devem ser iguais.
Além disso, deve conter todas as restrições NOT NULL
e CHECK da tabela alvo, e não estar marcada
como NO INHERIT.
No momento, as restrições FOREIGN KEY não são
consideradas.
As restrições UNIQUE e PRIMARY KEY
da tabela mãe serão criadas na partição, caso ainda não existam.
Se a nova partição for uma tabela regular, uma varredura completa
da tabela será executada para verificar se as linhas existentes
na tabela não violam a restrição de partição.
É possível evitar esta verificação adicionando uma restrição
CHECK válida à tabela, aceitando apenas as
linhas que satisfaçam a restrição de partição desejada, antes
de executar este comando.
A restrição CHECK será usada para determinar
que a tabela não precisa ser varrida para validar a restrição
de partição.
Entretanto, isto não irá funcionar se qualquer uma das chaves de
partição for uma expressão, e a partição não aceitar valores
NULL.
Se for anexada uma partição de lista que não aceita valores
NULL, deverá ser adicionada também a restrição
NOT NULL à coluna de chave de partição,
a menos que seja uma expressão.
Se a nova partição for uma tabela estrangeira, nada será feito para verificar se todas as linhas na tabela estrangeira obedecem à restrição de partição. (Veja a discussão sobre restrições em tabela estrangeira em CREATE FOREIGN TABLE.)
Quando a tabela tem uma partição padrão, a definição de uma nova
partição altera a restrição de partição para a partição padrão.
A partição padrão não pode conter nenhuma linha que precise ser
movida para a nova partição, e será varrida para verificar
se nenhuma está presente.
Esta varredura, como a varredura da nova partição, pode ser evitada
se estiver presente uma restrição CHECK apropriada.
Assim como a varredura da nova partição, ela será sempre ignorada
quando a partição padrão for uma tabela estrangeira.
Anexar uma partição adquire um bloqueio
SHARE UPDATE EXCLUSIVE na tabela mãe,
além dos bloqueios ACCESS EXCLUSIVE na tabela
que está sendo anexada e na partição padrão (se houver).
Também deverão ser mantidos bloqueios adicionais em todas as
subpartições, se a tabela que está sendo anexada for uma tabela
particionada.
Igualmente, se a própria partição padrão for uma tabela
particionada.
O bloqueio das subpartições pode ser evitado adicionando uma
restrição CHECK, conforme descrito na
Manutenção de partição.
DETACH PARTITION nome_da_partição [ CONCURRENTLY | FINALIZE ] #
Esta forma desanexa a partição especificada da tabela de destino.
A partição desanexada continua a existir como uma tabela autônoma,
mas não tem mais nenhum vínculo com a tabela da qual foi desanexada.
Quaisquer índices que foram anexados aos índices da tabela de
destino são desanexados.
Quaisquer gatilhos que foram criados como clones daqueles na
tabela de destino são removidos.
É obtido o bloqueio SHARE em quaisquer tabelas
que façam referência a esta tabela particionada em restrições
de chave estrangeira.
Se for especificado CONCURRENTLY, será executado
usando um nível de bloqueio reduzido para evitar o bloqueio de
outras sessões que possam estar acessando a tabela particionada.
Neste modo, são usadas internamente duas transações.
Durante a primeira transação, é obtido um bloqueio
SHARE UPDATE EXCLUSIVE na tabela-mãe e na
partição, e a partição é marcada como sendo desanexada;
neste ponto, a transação é efetivada, e aguardado que todas as
outras transações que usam a tabela particionada terminem.
Após a conclusão de todas estas transações, a segunda transação
adquire um bloqueio SHARE UPDATE EXCLUSIVE
na tabela particionada, e ACCESS EXCLUSIVE
na partição, e o processo de desanexação é concluído.
É incluída na partição uma restrição CHECK
que duplica a restrição de partição.
CONCURRENTLY não pode ser executado em um
bloco de transação, e não é permitido se a tabela particionada
tiver uma partição padrão.
Se for especificado FINALIZE, uma chamada a
DETACH CONCURRENTLY anterior que foi cancelada
ou interrompida é completada.
Pode estar pendente de desanexação no máximo uma partição de uma
tabela particionada por vez.
Todas as formas de ALTER TABLE que atuam em uma
única tabela, exceto RENAME,
SET SCHEMA, ATTACH PARTITION e
DETACH PARTITION, podem ser combinadas em uma
lista de múltiplas alterações a serem aplicadas juntas.
Por exemplo, é possível adicionar várias colunas e/ou alterar o
tipo de dados de várias colunas em um único comando.
Isto é particularmente útil com tabelas grandes, porque precisa ser
feita apenas uma passagem sobre a tabela.
É necessário ser o dono da tabela para poder executar o comando
ALTER TABLE.
Para alterar o esquema ou espaço de tabelas de uma tabela, também é
necessário ter o privilégio CREATE no novo esquema
ou espaço de tabelas.
Para adicionar a tabela como uma nova filha de uma tabela mãe,
também é necessário ser o dono da tabela mãe.
Além disso, para anexar uma tabela como uma nova partição da tabela,
é necessário ser o dono da tabela que está sendo anexada.
Para alterar o dono, é necessário ser capaz de executar o comando
SET ROLE para a função de banco de dados
(role) que será a nova dona,
e esta função de banco de dados precisa possuir o privilégio
CREATE no esquema da tabela.
(Estas restrições impõem que alterar o dono não faz nada que
não poderia ser feito excluindo e recriando a tabela.
Entretanto, um superusuário pode alterar o dono de qualquer
tabela.)
Para adicionar uma coluna, alterar o tipo de dados de uma coluna
ou usar a cláusula OF, é necessário ter o
privilégio USAGE no tipo de dados.
IF EXISTS #Não será relatado nenhum erro se a tabela não existir. É emitido um aviso neste caso.
nome_da_tabela #
O nome (opcionalmente qualificado pelo esquema) da tabela
existente a ser alterada.
Se for especificado ONLY antes do nome da
tabela, somente esta tabela será alterada.
Se não for especificado ONLY, a tabela e
todas as suas tabelas descendentes (se houver) serão alteradas.
Opcionalmente, pode ser especificado um *
após o nome da tabela para indicar explicitamente que as tabelas
descendentes estão incluídas.
nome_da_coluna #O nome da coluna nova ou existente.
novo_nome_da_coluna #O novo nome para a coluna existente.
novo_nome #O novo nome para a tabela.
tipo_de_dados #O tipo de dados da nova coluna, ou o novo tipo de dados para a coluna existente.
restrição_de_tabela #A nova restrição de tabela para a tabela.
nome_da_restrição #O nome da restrição nova ou existente.
CASCADE #Exclui automaticamente os objetos que dependem da coluna ou restrição sendo excluída (por exemplo, visões que fazem referência à coluna) e, por sua vez, todos os objetos que dependem desses objetos (veja Acompanhamento de dependência).
RESTRICT #Recusa remover a coluna ou restrição se houver algum objeto dependente. Este é o comportamento padrão.
nome_do_gatilho #O nome de um único gatilho para desativar ou ativar.
ALL #Desativa ou ativa todos os gatilhos pertencentes à tabela. (Requer privilégio de superusuário, se algum dos gatilhos for gatilho de restrição gerado internamente, como os que são usados para implementar restrições de chave estrangeira ou de unicidade postergável, e restrições de exclusão.)
USER #Desativa ou ativa todos os gatilhos pertencentes à tabela, exceto os gatilhos de restrição gerados internamente, como aqueles usados para implementar restrições de chave estrangeira ou de unicidade postergável, e restrições de exclusão.
nome_do_índice #O nome de um índice existente.
parâmetro_de_armazenamento #O nome de um parâmetro de armazenamento da tabela.
valor #O novo valor para o parâmetro de armazenamento da tabela. Pode ser um número ou uma palavra, dependendo do parâmetro.
tabela_mãe #A tabela mãe para associar ou desassociar a esta tabela.
novo_dono #O nome de usuário do novo dono da tabela.
novo_método_de_acesso #O nome do método de acesso para o qual a tabela será convertida.
novo_espaço_de_tabelas #O nome do espaço de tabelas para o qual a tabela será movida.
novo_esquema #O nome do esquema para o qual a tabela será movida.
nome_da_partição #O nome da tabela a ser anexada como uma nova partição, ou desanexada dessa tabela.
especificação_de_limite_de_partição #Especificação dos limites da partição para a nova partição. Consulte CREATE TABLE para obter mais detalhes sobre esta sintaxe.
A palavra chave COLUMN é ruído, podendo ser omitida.
Quando uma coluna é adicionada com ADD COLUMN
e é especificado um valor DEFAULT não volátil,
o valor padrão é avaliado no momento da instrução e o resultado é
armazenado nos metadados da tabela, onde será retornado quando
qualquer linha existente for acessada.
O valor só será aplicado quando a tabela for reescrita, tornando o
comando ALTER TABLE muito rápido, mesmo em
tabelas grandes.
Se não for especificada nenhuma restrição de coluna, será usado
NULL como valor padrão.
Em nenhum dos casos é necessário reescrever a tabela.
Adicionando uma coluna com um valor DEFAULT
volátil (por exemplo, clock_timestamp()),
uma coluna gerada armazenada, uma coluna de identidade ou uma
coluna com um tipo de dados de domínio que possui restrições fará
com que toda a tabela e seus índices sejam reescritos.
Adicionar uma coluna virtual gerada nunca requer uma reescrita.
Alterar o tipo de dados de uma coluna existente normalmente fará
com que toda a tabela e seus índices sejam reescritos.
Como uma exceção, ao alterar o tipo de uma coluna existente,
se a cláusula USING não alterar o conteúdo
da coluna e o tipo de dados antigo for coercível binariamente
para o novo tipo de dados ou um domínio irrestrito sobre o novo
tipo de dados, não será necessário reescrever a tabela.
Entretanto, os índices ainda serão reconstruídos, a menos que o
sistema possa verificar se o novo índice é logicamente equivalente
ao existente.
Por exemplo, se a ordenação de uma coluna foi alterada, será
necessário reconstruir o índice, porque a nova ordem de
classificação pode ser diferente.
Entretanto, na ausência de uma alteração de ordenação, uma coluna
pode ser alterada de text para varchar
(ou vice-versa) sem reconstruir os índices, porque estes tipos de
dados são classificados de forma idêntica.
A reconstrução de tabelas e/ou índices pode levar um tempo considerável para tabelas grandes e, temporariamente, ocupar até o dobro do espaço em disco.
Adicionar uma restrição CHECK ou
NOT NULL requer a varredura da tabela para
verificar se as linhas existentes atendem à restrição,
mas não requer a reescrita da tabela.
Se for adicionada uma restrição CHECK como
NOT ENFORCED, nenhuma verificação será realizada.
Da mesma forma, ao anexar uma nova partição, ela pode ser verificada para garantir que as linhas existentes atendam à restrição de partição.
O principal motivo para oferecer a opção de especificar várias
alterações em um único comando ALTER TABLE é que,
desta forma, várias varreduras ou reescritas de tabela podem ser
combinadas em uma única passagem pela tabela.
A varredura de uma tabela grande para verificar novas restrições
de chave estrangeira ou de não-nulo pode demorar bastante,
e outras atualizações na tabela ficam bloqueadas até que o
comando ALTER TABLE ADD CONSTRAINT seja efetivado.
O principal objetivo da opção de restrição NOT VALID
é reduzir o impacto da adição de uma restrição em atualizações
concorrentes.
Com NOT VALID, o comando
ADD CONSTRAINT não realiza uma varredura na
tabela e pode ser efetivado imediatamente.
Após isto, um comando VALIDATE CONSTRAINT pode
ser emitido para verificar se as linhas existentes satisfazem a
restrição.
A etapa de validação não precisa bloquear atualizações concorrentes,
porque sabe que outras transações estarão aplicando a restrição às
linhas que elas inserem ou atualizam; apenas as linhas preexistentes
precisam ser verificadas.
Portanto, a validação adquire apenas um bloqueio
SHARE UPDATE EXCLUSIVE na tabela que está sendo
alterada.
(Se a restrição for uma chave estrangeira, um bloqueio
ROW SHARE também será necessário na tabela
referenciada pela restrição.)
Além de melhorar a concorrência, pode ser útil usar
NOT VALID e VALIDATE CONSTRAINT
nos casos em que se sabe que a tabela contém violações pré-existentes.
Uma vez que a restrição esteja em vigor, nenhuma nova violação poderá
ser inserida, e os problemas existentes poderão ser corrigidos com
calma até que VALIDATE CONSTRAINT seja
finalmente concluído com sucesso.
A forma DROP COLUMN não remove fisicamente a
coluna, mas simplesmente a torna invisível para operações
SQL.
As operações subsequentes de inserção e atualização na tabela
armazenarão um valor nulo para a coluna.
Assim, excluir uma coluna é rápido, mas não reduzirá imediatamente
o espaço em disco da tabela, porque o espaço ocupado pela coluna
excluída não é recuperado.
O espaço será recuperado ao longo do tempo à medida que as linhas
existentes forem atualizadas.
Para forçar a recuperação imediata do espaço ocupado por uma coluna
excluída, pode-se executar uma das formas do comando
ALTER TABLE que reescreve a tabela inteira.
Isto resulta na reconstrução de cada linha com a coluna excluída
substituída por um valor nulo.
As formas de reescrita de ALTER TABLE não são
seguras com com relação ao MVCC
(Controle de Concorrência Multiversão).
Após a reescrita da tabela, a tabela aparecerá vazia para transações
concorrentes, caso estejam utilizando um instantâneo tirado antes
da reescrita.
Veja Advertências para obter mais detalhes.
A opção USING de SET DATA TYPE
pode, na verdade, especificar qualquer expressão que envolva os
valores antigos da linha; ou seja, pode se referir a outras colunas
além daquela que está sendo convertida.
Isto permite que conversões muito gerais sejam feitas com a sintaxe
SET DATA TYPE.
Devido a esta flexibilidade, a expressão USING
não é aplicada ao valor padrão da coluna (se houver); o resultado
pode não ser uma expressão constante, como exigido para um valor padrão.
Isto significa que, quando não houver conversão implícita ou por
atribuição do tipo de dados antigo para o novo,
SET DATA TYPE poderá não conseguir converter
o valor padrão, mesmo que seja fornecida uma cláusula
USING.
Nestes casos, elimine o valor padrão com
DROP DEFAULT, execute ALTER TYPE e,
então, use SET DEFAULT para adicionar um novo
valor padrão adequado.
Considerações semelhantes aplicam-se aos índices e restrições que
envolvem a coluna.
Se a tabela tiver tabelas descendentes, não será permitido adicionar,
renomear ou alterar o tipo de dados de uma coluna na tabela mãe
sem fazer o mesmo nas tabelas descendentes.
Isto garante que as descendentes sempre tenham colunas
correspondentes a da mãe.
Da mesma forma, uma restrição CHECK não pode ser
renomeada no elemento mãe sem também ser renomeada em todos as suas
descendentes, para que as restrições CHECK
também correspondam entre a mãe e suas descendentes.
(Esta restrição, no entanto, não se aplica a restrições baseadas
em índices.)
Além disso, como selecionar a partir do elemento mãe também seleciona
a partir de suas descendentes, uma restrição no elemento mãe não
pode ser marcada como válida a menos que também seja marcada como
válida para estes descendentes.
Em todos estes casos, o comando ALTER TABLE ONLY
será rejeitado.
Uma operação DROP COLUMN recursiva removerá a
coluna de uma tabela descendente somente se a tabela descendente
não herdar esta coluna de nenhuma outra tabela mãe e nunca tiver
tido uma definição independente da coluna.
Uma operação DROP COLUMN não recursiva
(ou seja., ALTER TABLE ONLY ... DROP COLUMN)
nunca remove nenhuma coluna descendente, mas, em vez disso, as marca
como definidas independentemente em vez de herdadas.
Um comando DROP COLUMN não recursivo irá falhar
em uma tabela particionada, porque todas as partições da tabela
devem ter as mesmas colunas que a raiz do particionamento.
As ações para colunas de identidade (ADD GENERATED,
SET etc., DROP IDENTITY),
bem como as ações CLUSTER, OWNER,
e TABLESPACE nunca são recursivas para as tabelas
descendentes; ou seja, elas sempre agem como se tivesse sido
especificado ONLY.
As ações que afetam os estados de gatilho são aplicadas recursivamente
às partições de tabelas particionadas (a menos que seja especificado
ONLY), mas nunca às descendentes de herança
tradicional.
A adição de uma restrição só se aplica recursivamente a restrições
CHECK que não estejam marcadas com
NO INHERIT.
Não é permitido alterar qualquer parte de uma tabela do catálogo do sistema.
Veja CREATE TABLE para obter uma descrição adicional dos parâmetros válidos. O Definição de dados tem mais informações sobre herança.
Para adicionar uma coluna do tipo varchar a uma tabela:
ALTER TABLE distributors ADD COLUMN address varchar(30);
Isto fará com que todas as linhas existentes na tabela sejam preenchidas com valores nulos para a nova coluna.
Para adicionar uma coluna com um valor padrão não nulo:
ALTER TABLE measurements ADD COLUMN mtime timestamp with time zone DEFAULT now();
As linhas existentes serão preenchidas com a hora corrente como valor da nova coluna e, em seguida, as novas linhas receberão a hora de sua inserção.
Para adicionar uma coluna e preenchê-la com um valor diferente do padrão para ser usado posteriormente:
ALTER TABLE transactions ADD COLUMN status varchar(30) DEFAULT 'old', ALTER COLUMN status SET default 'current';
As linhas existentes serão preenchidas com old,
mas o valor padrão para os comandos posteriores será
current.
Os efeitos são os mesmos como se os dois subcomandos tivessem sido
executados em comandos ALTER TABLE distintos.
Para excluir uma coluna de uma tabela:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
Para alterar os tipos de dados de duas colunas existentes em uma única operação:
ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
Para alterar uma coluna de números inteiros, contendo carimbos de
data e hora Unix, para
timestamp with time zone através da cláusula
USING:
ALTER TABLE foo
ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
A mesma coisa, quando a coluna tiver uma expressão de valor padrão que não será convertida automaticamente para o novo tipo de dados:
ALTER TABLE foo
ALTER COLUMN foo_timestamp DROP DEFAULT,
ALTER COLUMN foo_timestamp TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
ALTER COLUMN foo_timestamp SET DEFAULT now();
Para renomear uma coluna existente:
ALTER TABLE distributors RENAME COLUMN address TO city;
Para renomear uma tabela existente:
ALTER TABLE distributors RENAME TO suppliers;
Para renomear uma restrição existente:
ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;
Para adicionar uma restrição de não nulo a uma coluna:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
Para remover uma restrição de não nulo de uma coluna:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
Para adicionar uma restrição de verificação a uma tabela e todas as suas filhas:
ALTER TABLE distributors ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5);
Para adicionar uma restrição de verificação apenas a uma tabela e não as suas filhas:
ALTER TABLE distributors ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5) NO INHERIT;
(A restrição de verificação não será herdada por futuras filhas, também)
Para remover uma restrição de verificação de uma tabela e de todas as suas filhas:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
Para remover uma restrição de verificação de apenas uma tabela:
ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
(A restrição de verificação permanece em vigor para todas as tabelas filhas.)
Para adicionar uma restrição de chave estrangeira a uma tabela:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
REFERENCES addresses (address);
Para adicionar uma restrição de chave estrangeira a uma tabela com o menor impacto em outro trabalho:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;
Para adicionar uma restrição de unicidade (de várias colunas) a uma tabela:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key
UNIQUE (dist_id, zipcode);
Para adicionar uma restrição de chave primária a uma tabela, com o nome dado automaticamente, observando que uma tabela só pode ter uma chave primária:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
Para mover a tabela para um espaço de tabelas diferente:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
Para mover a tabela para um esquema diferente:
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
Para recriar a restrição de chave primária, sem bloquear atualizações enquanto o índice é reconstruído:
CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx
ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
ADD CONSTRAINT distributors_pkey
PRIMARY KEY USING INDEX dist_id_temp_idx;
Para anexar uma partição a uma tabela particionada por intervalo:
ALTER TABLE measurement
ATTACH PARTITION measurement_y2016m07 FOR VALUES
FROM ('2016-07-01') TO ('2016-08-01');
Para anexar uma partição a uma tabela particionada por lista:
ALTER TABLE cities
ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
Para anexar uma partição a uma tabela particionada por hash:
ALTER TABLE orders
ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);
Para anexar uma partição padrão a uma tabela particionada:
ALTER TABLE cities
ATTACH PARTITION cities_partdef DEFAULT;
Para desanexar uma partição de uma tabela particionada:
ALTER TABLE measurement
DETACH PARTITION measurement_y2015m12;
As formas ADD [COLUMN],
DROP [COLUMN], DROP IDENTITY, RESTART,
SET DEFAULT, SET DATA TYPE (sem USING),
SET GENERATED e SET
estão em conformidade com o padrão SQL.
A forma opção_de_sequênciaADD
está em conformidade com o padrão SQL quando as
cláusulas restrição_de_tabelaUSING INDEX e NOT VALID
são omitidas e o tipo de restrição é um entre CHECK,
UNIQUE, PRIMARY KEY ou
REFERENCES.
As outras formas são extensões do PostgreSQL
ao padrão SQL.
Além disso, a capacidade de especificar mais de uma manipulação
em um único comando ALTER TABLE é uma extensão.
ALTER TABLE DROP COLUMN pode ser usado para
remover a única coluna de uma tabela, deixando-a com zero colunas.
Esta é uma extensão ao padrão SQL, que não
permite tabelas com zero colunas.