O MaxCompute permite modificar colunas em tabelas existentes. Adicione ou exclua colunas e altere os tipos de dados para atender aos requisitos de negócios.
Comandos
A tabela a seguir descreve os comandos SQL do MaxCompute para operações com colunas.
Ações | Descrição | Função | Plataforma |
Adiciona colunas ou comentários a uma tabela particionada ou não particionada existente. | Usuários com permissão Alter na tabela | Execute estes comandos nas seguintes plataformas: | |
Exclui colunas de uma tabela particionada ou não particionada existente. | |||
Altera o tipo de dados de uma coluna existente. | |||
Ajusta a ordem de uma coluna especificada na tabela. | |||
Modifica o nome de uma coluna em uma tabela particionada ou não particionada existente. | |||
Atualiza o comentário de uma coluna em uma tabela particionada ou não particionada existente. | |||
Altera simultaneamente o nome e o comentário de uma coluna em uma tabela particionada ou não particionada existente. | |||
Modifica a propriedade NOT NULL de uma coluna que não é chave de partição. |
Observações de uso
A evolução de schema envolve operações como adicionar colunas com tipos de dados complexos, excluir colunas, reordenar colunas e alterar tipos de dados. Ao reordenar, adicionar e reordenar ou excluir colunas, o comportamento de leitura e gravação da tabela muda e as seguintes limitações se aplicam:
Se o tipo de job for MapReduce 1.0, as tarefas Graph não leem nem gravam dados na tabela modificada.
-
Para jobs CUPID, apenas as versões do Spark listadas abaixo leem dados da tabela. A gravação de dados na tabela não é suportada.
Spark-2.3.0-odps0.34.0
Spark-3.1.1-odps0.34.0
Jobs do PAI leem dados da tabela, mas não permitem gravação.
Em jobs do Hologres com versão anterior a 1,3, a leitura e a gravação na tabela modificada falham ao referenciá-la como tabela externa.
Após a evolução de schema, CLONE TABLE não é suportado.
O Streaming Tunnel retorna erro se houver evolução de schema.
Adicionar colunas ou comentários
Adicione colunas ou comentários a uma tabela particionada ou não particionada existente. Para mais informações sobre as restrições, consulte Usage notes. O MaxCompute suporta a adição de colunas do tipo STRUCT, como STRUCT<x: STRING, y: BIGINT> e MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>>.
-
Pré-requisitos
Execute o comando
setproject odps.schema.evolution.enable=true;para ativar a evolução de schema.Permissões: Esta é uma propriedade no nível do projeto. Para executar este comando, você deve ser o proprietário do projeto ou ter a função Super_Administrator ou Admin no nível do projeto. Para mais informações, consulte Assign a built-in management role to a user.
Tempo de efetivação: A alteração entra em vigor em aproximadamente 10 minutos.
-
Sintaxe
ALTER TABLE <table_name> ADD COLUMNS [IF NOT EXISTS] (<col_name1> <type1> COMMENT ['<col_comment>'] [, <col_name2> <type2> COMMENT '<col_comment>'...] ); -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar. As novas colunas são adicionadas ao final da tabela.
col_name
Sim
Nome da nova coluna.
type
Sim
Tipo de dados da nova coluna.
col_comment
Não
Comentário da nova coluna.
-
Exemplos
-
Exemplo 1: Adicionar duas colunas à tabela sale_detail.
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT); -
Exemplo 2: Adicionar duas colunas com comentários à tabela sale_detail.
ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' ); -
Exemplo 3: Adicionar uma coluna de tipo de dados complexo à tabela sale_detail.
ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>); -
Exemplo 4: Ao usar IF NOT EXISTS para adicionar uma coluna já existente, o comando retorna sucesso sem duplicar a coluna.
-- The statement is successful, but the ID column is not repeatedly added. ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint); -
Exemplo 5: Adicionar uma coluna a uma tabela Delta.
CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) TBLPROPERTIES ("transactional"="true"); ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);
-
Excluir colunas
Exclua uma ou mais colunas de uma tabela particionada ou não particionada existente. Para mais informações sobre as restrições, consulte Usage notes.
-
Pré-requisitos
Execute o comando
setproject odps.schema.evolution.enable=true;para ativar a evolução de schema.Permissões: Esta é uma propriedade no nível do projeto. Para executar este comando, você deve ser o proprietário do projeto ou ter a função Super_Administrator ou Admin no nível do projeto. Para mais informações, consulte Assign a built-in management role to a user.
Tempo de efetivação: A alteração entra em vigor em aproximadamente 10 minutos.
-
Sintaxe
-- Delete a single column. ALTER TABLE <table_name> DROP COLUMN <col_name>; -- Delete multiple columns. ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...]; -
Parâmetros
table_name: Obrigatório. Nome da tabela a modificar.
col_name: Obrigatório. Nome da coluna a excluir.
-
Exemplos
-- Example 1: Delete the customer_id column from the sale_detail table. ALTER TABLE sale_detail DROP COLUMNS customer_id; -- Example 2: Delete the shop_name and total_price columns from the sale_detail table. ALTER TABLE sale_detail DROP COLUMNS shop_name, total_price;
Alterar tipos de dados de colunas
Altere o tipo de dados de uma coluna existente. Para mais informações sobre as restrições, consulte Usage notes.
-
Pré-requisitos
Execute o comando
setproject odps.schema.evolution.enable=true;para ativar a evolução de schema.Permissões: Esta é uma propriedade no nível do projeto. Para executar este comando, você deve ser o proprietário do projeto ou ter a função Super_Administrator ou Admin no nível do projeto. Para mais informações, consulte Assign a built-in management role to a user.
Tempo de efetivação: A alteração entra em vigor em aproximadamente 10 minutos.
-
Sintaxe
ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela que contém a coluna.
old_column_name
Sim
Nome da coluna a modificar.
new_column_name
Sim
Novo nome da coluna.
old_column_name pode ser igual a new_column_name, indicando que o nome da coluna não será modificado. No entanto, new_column_name não pode ser igual ao nome de nenhuma outra coluna além de old_column_name.
new_data_type
Sim
Novo tipo de dados da coluna.
-
Exemplo
-- Change the data type of the id field in the sale_detail table from BIGINT to STRING. ALTER TABLE sale_detail CHANGE COLUMN id id STRING; -
Conversões de tipos de dados suportadas
NotaY indica que a conversão é suportada. N indica que a conversão não é suportada. - indica que a conversão não se aplica. Y() indica que a conversão é suportada se a condição entre parênteses for atendida.

Alterar a ordem das colunas
Altere a ordem das colunas em uma tabela particionada ou não particionada existente. Para mais informações sobre as restrições, consulte Usage notes.
-
Pré-requisitos
Execute o comando
setproject odps.schema.evolution.enable=true;para ativar a evolução de schema.Permissões: Esta é uma propriedade no nível do projeto. Para executar este comando, você deve ser o proprietário do projeto ou ter a função Super_Administrator ou Admin no nível do projeto. Para mais informações, consulte Assign a built-in management role to a user.
Tempo de efetivação: A alteração entra em vigor em aproximadamente 10 minutos.
-
Sintaxe
ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar.
old_column_name
Sim
Nome da coluna a mover.
new_col_name
Sim
Novo nome da coluna.
new_col_name pode ser igual a old_column_name, indicando que o nome da coluna não será modificado. No entanto, new_col_name não pode ser igual a nenhum outro nome de coluna além de old_column_name.
column_type
Sim
Tipo de dados original da coluna. Não pode ser alterado.
column_name
Sim
Move a coluna a reordenar para após column_name.
-
Exemplos
-- Change the name of the customer column in the sale_detail table to customer_id and move it after the total_price column. ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price; -- Move the customer_id column in the sale_detail table after the total_price column without changing the column name. ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;
Alterar o nome de uma coluna
Modifique o nome de uma coluna em uma tabela particionada ou não particionada existente.
-
Sintaxe
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar.
old_col_name
Sim
Nome atual da coluna. A coluna deve existir.
new_col_name
Sim
Novo nome da coluna. O nome da coluna deve ser único dentro da tabela.
-
Exemplo
-- Rename the customer_name column in the sale_detail table to customer. ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;
Alterar o comentário de uma coluna
Modifique o comentário de uma coluna em uma tabela particionada ou não particionada existente.
-
Sintaxe
ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>'; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar.
col_name
Sim
Nome da coluna cujo comentário será alterado. A coluna deve existir.
col_comment
Sim
Novo comentário, que deve ser uma string válida. O comprimento máximo é de 1.024 bytes.
-
Exemplo
-- Change the comment of the customer column in the sale_detail0113 table. ALTER TABLE sale_detail0113 CHANGE COLUMN customer COMMENT 'customer';
Alterar o nome e o comentário de uma coluna
Altere o nome e o comentário de uma coluna em uma tabela particionada ou não particionada.
-
Sintaxe
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>'; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar.
old_col_name
Sim
Nome atual da coluna a modificar. A coluna deve existir.
new_col_name
Sim
Novo nome da coluna. O nome da coluna deve ser único dentro da tabela.
column_type
Sim
Tipo de dados da coluna.
col_comment
Opcional
Novo comentário. O comprimento máximo é de 1.024 bytes.
-
Exemplo
-- Change the name of the customer column in the sale_detail table to customer_newname and change its comment to 'customer'. ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';
Alterar a propriedade NOT NULL de uma coluna
Modifique a propriedade NOT NULL de uma coluna que não é chave de partição. Por exemplo, se uma coluna que não é chave de partição estiver definida para não permitir valores NULL, use este comando para permitir valores NULL.
Esta operação é irreversível: após permitir valores NULL, não é possível reverter a coluna para não permiti-los.
-
Execute o comando
DESC EXTENDED table_name;para visualizar a propriedadeNullablee determinar se a coluna permite valores NULL:Se
Nullablefortrue, valores NULL são permitidos.Se
Nullableforfalse, valores NULL não são permitidos.
-
Sintaxe
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL; -
Parâmetros
Parâmetro
Obrigatório
Descrição
table_name
Sim
Nome da tabela a modificar.
old_col_name
Sim
Nome da coluna que não é chave de partição a modificar. A coluna deve existir.
-
Exemplo
-- Create a partitioned table in which the id column cannot be NULL. CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string); -- View table properties. DESC EXTENDED null_test; -- The following result is returned: +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | int | | | false | NULL | | | name | string | | | true | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | ds | string | | +------------------------------------------------------------------------------------+ -- Allow the id column to be NULL. ALTER TABLE null_test CHANGE COLUMN id NULL; -- View table properties. DESC EXTENDED null_test; -- The following result is returned: +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | int | | | true | NULL | | | name | string | | | true | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | ds | string | | +------------------------------------------------------------------------------------+
Referências
Para mais informações sobre operações com tabelas, consulte os seguintes tópicos: