Todos os produtos
Search
Central de documentação

AnalyticDB:ALTER TABLE

Última atualização: Jul 04, 2026

O comando ALTER TABLE modifica o esquema de uma tabela existente no AnalyticDB for MySQL. Use-o para renomear tabelas e colunas, alterar tipos de dados e restrições de colunas, gerencie índices, ajustar ciclos de vida de partições e configure políticas de armazenamento em camadas.

Tabela de exemplo

A maioria dos exemplos neste tópico usa a tabela customer. Se você ainda não a criou, execute a seguinte instrução:

Instrução de exemplo para criação da tabela

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT 'Customer ID',
  customer_name VARCHAR NOT NULL COMMENT 'Customer name',
  phone_num BIGINT NOT NULL COMMENT 'Phone number',
  city_name VARCHAR NOT NULL COMMENT 'City',
  sex INT NOT NULL COMMENT 'Gender',
  id_number VARCHAR NOT NULL COMMENT 'ID card number',
  home_address VARCHAR NOT NULL COMMENT 'Home address',
  office_address VARCHAR NOT NULL COMMENT 'Office address',
  age INT NOT NULL COMMENT 'Age',
  login_time TIMESTAMP NOT NULL COMMENT 'Logon time',
  PRIMARY KEY (login_time,customer_id,phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT 'Customer information table';

Os exemplos de índices JSON, chaves estrangeiras e índices vetoriais usam suas próprias definições de tabela.

Sintaxe

ALTER TABLE table_name
  { ADD [COLUMN] column_name column_definition
  | ADD [COLUMN] (column_name column_definition,...)
  | ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)
  | ADD {INDEX|KEY} [index_name] (column_name)
  | ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
  | ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
  | ADD CLUSTERED [INDEX|KEY] [index_name] (column_name [ASC|DESC])
  | ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
  | ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
  | COMMENT 'comment'
  | DROP CLUSTERED KEY index_name
  | DROP [COLUMN] column_name
  | DROP FOREIGN KEY symbol
  | DROP FULLTEXT INDEX index_name
  | DROP {INDEX|KEY} index_name
  | DROP PARTITION (partition_name,...)
  | MODIFY [COLUMN] column_name column_definition
  | RENAME COLUMN column_name TO new_column_name
  | RENAME new_table_name
  | INDEX_ALL = {'Y'|'N'}
  | storage_policy
  | PARTITION BY VALUE{(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE N
  }

column_definition:
 column_type [column_attributes][column_constraints][COMMENT 'comment']

column_attributes:
 [DEFAULT{constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT]

column_constraints:
 [NULL|NOT NULL]

storage_policy:
 STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}

Tabelas

Renomear uma tabela

ALTER TABLE db_name.table_name RENAME new_table_name

Exemplo: Renomeie customer para new_customer.

ALTER TABLE customer RENAME new_customer;

Alterar um comentário de tabela

ALTER TABLE db_name.table_name COMMENT 'comment'

Exemplo: Atualize o comentário da tabela customer.

ALTER TABLE customer COMMENT 'Customer table';

Colunas

Adicionar uma coluna

ALTER TABLE db_name.table_name ADD [COLUMN]
  {column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
  | (column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}
Não é possível adicionar colunas de chave primária.

Exemplo 1: Adicione uma coluna province do tipo VARCHAR à tabela customer.

ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Province';

Exemplo 2: Adicione duas colunas simultaneamente: vip do tipo BOOLEAN e tags do tipo VARCHAR.

ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'Is VIP', tags VARCHAR DEFAULT 'None' COMMENT 'Tag');

Excluir uma coluna

ALTER TABLE db_name.table_name DROP [COLUMN] column_name
Não é possível excluir colunas de chave primária.

Exemplo: Exclua a coluna province da tabela customer.

ALTER TABLE adb_demo.customer DROP COLUMN province;

Renomear uma coluna

ALTER TABLE db_name.table_name RENAME COLUMN column_name TO new_column_name
Não é possível renomear colunas de chave primária.

Exemplo: Renomeie city_name para city na tabela customer.

ALTER TABLE customer RENAME COLUMN city_name TO city;

Alterar o tipo de dados de uma coluna

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type

As alterações de tipo de dados seguem regras de ampliação: você pode expandir o intervalo de um tipo, mas não reduzi-lo. A tabela abaixo resume as alterações suportadas:

Alteração

Suportada

Inteiro menor para inteiro maior (ex.: TINYINT para BIGINT)

Sim

Inteiro maior para inteiro menor (ex.: BIGINT para TINYINT)

Não

FLOAT para DOUBLE

Sim

DOUBLE para FLOAT

Não

Tipo inteiro para ponto flutuante (FLOAT ou DOUBLE)

Sim (requer versão específica)

Aumentar precisão DECIMAL

Sim (requer versão específica)

Reduzir precisão DECIMAL

Não

Alteração de tipo de dados em coluna de chave primária

Não

Importante

A conversão de tipo inteiro para ponto flutuante e o aumento da precisão DECIMAL exigem um cluster com versão de kernel 3.1.8.10–3.1.8.x, 3.1.9.6–3.1.9.x, 3.1.10.3–3.1.10.x ou 3.2.0.1 ou posterior.

Exemplo: Modifique a coluna age de INT para BIGINT.

ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;

Alterar o valor padrão de uma coluna

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}

Exemplo 1: Defina o valor padrão de sex como 0.

ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;

Exemplo 2: Defina o valor padrão de login_time como CURRENT_TIMESTAMP.

ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Permitir valores NULL

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type NULL
Apenas alterações de NOT NULL para NULL são suportadas. A mudança de NULL para NOT NULL não é permitida.

Exemplo: Permita que a coluna province aceite valores NULL.

ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;

Alterar o comentário de uma coluna

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'

Exemplo: Atualize o comentário da coluna province.

ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'The province where the customer is located';

Índices

Adicionar um índice comum

Por padrão, tabelas XUANWU_V2 são criadas sem índices de coluna completa (INDEX_ALL='N'), enquanto tabelas XUANWU os incluem (INDEX_ALL='Y'). Adicione um índice a colunas individuais conforme necessário.

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)

A coluna deve ter um tipo de dados simples. Para colunas JSON, consulte Adicionar um índice JSON.

Exemplo: Adicione um índice à coluna age.

ALTER TABLE adb_demo.customer ADD KEY age_idx(age);

Modificar índices de coluna completa

Em tabelas XUANWU_V2, alterne a indexação de coluna completa após a criação da tabela usando a propriedade INDEX_ALL. Essa configuração não afeta índices JSON, full-text ou vetoriais.

Pré-requisitos

A tabela XUANWU_V2 deve estar em um cluster com versão de kernel 3.2.3.7 ou posterior, ou 3.2.4.3 ou posterior.

Para visualizar e atualizar a versão secundária do seu cluster, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.
ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};

Valor

Efeito

Y

Modo de índice de coluna completa: cria índices comuns para todas as colunas

N

Modo sem índice de coluna completa: mantém apenas o índice de chave primária; todos os outros índices comuns são removidos

Notas de uso:

  • Para tabelas XUANWU, a indexação de coluna completa só pode ser configurada no momento da criação. Para desativá-la, exclua os índices individualmente.

  • Se INDEX_ALL='Y' e você excluir um índice comum usando uma instrução DDL (Data Definition Language), a propriedade mudará automaticamente para INDEX_ALL='N'. Apenas o índice alvo é removido; os demais permanecem inalterados.

  • Quando INDEX_ALL='N', o comando SHOW CREATE TABLE pode não exibir explicitamente essa propriedade, mas ela ainda estará ativa.

Exemplo 1: Desative a indexação de coluna completa em customer (atualmente INDEX_ALL='Y').

ALTER TABLE adb_demo.customer INDEX_ALL = 'N';

Após a execução, índices comuns em colunas que não são chave primária, como customer_name, city_name e sex, serão excluídos.

Exemplo 2: Ative a indexação de coluna completa em customer (atualmente INDEX_ALL='N', com índices existentes em customer_id, phone_num e login_time).

ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';

Após a execução, índices comuns serão criados para todas as colunas que ainda não possuem um, como customer_name, city_name e sex.

Adicionar um índice JSON

Notas de uso

O comportamento do índice JSON varia conforme o mecanismo da tabela:

  • Tabelas XUANWU_V2 (particionadas e não particionadas): o índice entra em vigor imediatamente, sem necessidade de job BUILD.

  • Tabelas XUANWU não particionadas: o índice entra em vigor somente após a conclusão de um job BUILD.

  • Tabelas XUANWU particionadas: acione manualmente um job BUILD de tabela completa. O índice entra em vigor apenas após a conclusão do job BUILD.

Índices JSON

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')

Parâmetro

Descrição

column_name

Crie um índice em uma coluna JSON. A coluna deve ser do tipo JSON.

column_name->'$.json_path'

Crie um índice em uma chave de propriedade específica dentro de um objeto JSON. Para mais informações, consulte Índices JSON.

Importante
  • A sintaxe column_name->'$.json_path' requer versão de cluster V3.1.6.8 ou posterior. Para visualizar e atualizar a versão secundária, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.

  • Se uma coluna JSON já tiver um índice, exclua-o antes de criar um índice em uma chave de propriedade dessa coluna.

Exemplo: Crie um índice JSON na propriedade a da coluna vj.

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);

INSERT INTO json_test VALUES(1,'{"a":1,"b":2}'),(2,'{"a":2,"b":3}');
ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');

Índices JSON Array

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')

column_name->'$[*]' especifica a coluna JSON Array a ser indexada. Por exemplo, vj->'$[*]' cria um índice JSON Array na coluna vj.

Exemplo: Crie um índice JSON Array na coluna vj.

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);

INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');
ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');

Excluir um índice comum ou JSON

ALTER TABLE db_name.table_name DROP KEY index_name

Execute SHOW INDEX FROM db_name.table_name; para encontrar o nome do índice.

Exemplo 1: Exclua o índice age_idx da tabela customer.

ALTER TABLE adb_demo.customer DROP KEY age_idx;

Exemplo 2: Exclua o índice JSON Array index_vj da tabela json_test.

ALTER TABLE adb_demo.customer DROP KEY index_vj;

Adicionar um índice clusterizado

ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])

Notas de uso:

  • Índices clusterizados ordenam em ordem crescente (ASC) por padrão. Para cargas de trabalho que exigem ordem decrescente, defina DESC ao criar a tabela.

  • Uma tabela pode ter apenas um índice clusterizado.

  • Após adicionar um índice clusterizado, acione e conclua um job BUILD para que ele entre em vigor. Execute SHOW CREATE TABLE db_name.table_name; para confirmar.

Exemplo: Adicione um índice clusterizado em customer_id.

ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);

Excluir um índice clusterizado

ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name

Execute SHOW CREATE TABLE db_name.table_name para encontrar o nome do índice clusterizado.

Exemplo: Exclua o índice clusterizado chamado index da tabela customer.

ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;

Adicionar um índice full-text

Pré-requisitos

Um cluster AnalyticDB for MySQL V3.1.4.9 ou posterior. Para melhores resultados, use V3.1.4.17 ou posterior.

Para obter informações sobre como consultar a versão secundária, consulte Como consulto a versão de um cluster AnalyticDB for MySQL?
ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]

Parâmetro

Descrição

column_name

A coluna a ser indexada. Deve ser do tipo VARCHAR.

index_option

Opcional. Especifica o tokenizador e o dicionário personalizado.

WITH ANALYZER analyzer_name

O analisador para o índice full-text. Consulte Analisadores para índices full-text.

WITH DICT tbl_dict_name

O dicionário personalizado para o índice full-text. Consulte Dicionários personalizados para índices full-text.

Importante

Um índice full-text entra em vigor somente após um job BUILD ser acionado e concluído.

Exemplo: Adicione um índice full-text à coluna home_address usando o analisador standard.

ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;

Para mais informações, consulte Criar um índice full-text.

Excluir um índice full-text

ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name

Exemplo: Exclua o índice full-text fidx_k da tabela customer.

ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;

Adicionar um índice vetorial

Pré-requisitos

Um cluster AnalyticDB for MySQL V3.1.4.0 ou posterior. Versões secundárias recomendadas: 3.1.5.16, 3.1.6.8, 3.1.8.6 e posteriores.

Se o seu cluster não estiver em uma das versões recomendadas, defina CSTORE_PROJECT_PUSH_DOWN e CSTORE_PPD_TOP_N_ENABLE como false antes de usar a busca vetorial. Para atualizar a versão secundária, entre em contato com o suporte técnico. Para obter informações sobre como consultar a versão secundária, consulte Como consulto a versão de um cluster AnalyticDB for MySQL?
ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ] [distancemeasure=SquaredL2]

Parâmetro

Descrição

index_name

O nome do índice. Para convenções de nomenclatura, consulte a seção Limites de nomenclatura.

column_name

A coluna vetorial a ser indexada. O tipo da coluna deve ser array<float>, array<byte> ou array<smallint>.

algorithm

O algoritmo usado para calcular a distância vetorial. Defina como HNSW_PQ.

distancemeasure

A fórmula de distância. Defina como SquaredL2. Fórmula: (x1-y1)^2 + (x2-y2)^2 + ... + (xn-yn)^2.

Exemplo: Crie índices vetoriais nas colunas float_feature e short_feature.

CREATE TABLE vector (
  xid BIGINT NOT NULL,
  cid BIGINT NOT NULL,
  uid VARCHAR NOT NULL,
  vid VARCHAR NOT NULL,
  wid VARCHAR NOT NULL,
  float_feature array<FLOAT>(4),
  short_feature array<SMALLINT>(4),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);
ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);

Adicionar uma chave estrangeira

Pré-requisitos

Um cluster AnalyticDB for MySQL V3.1.10 ou posterior.

Para visualizar e atualizar a versão secundária, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.
ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)

Parâmetro

Descrição

db_name.table_name

A tabela à qual a chave estrangeira será adicionada.

symbol

Opcional. O nome da restrição de chave estrangeira — deve ser único dentro da tabela. Se omitido, o parser usa <fk_column_name>_fk como nome da restrição.

fk_column_name

A coluna de chave estrangeira. Já deve existir.

pk_table_name

A tabela primária. Já deve existir.

pk_column_name

A coluna de chave primária da tabela primária. Já deve existir.

Notas de uso:

  • Uma tabela pode ter múltiplos índices de chave estrangeira.

  • Um índice de chave estrangeira não pode abranger múltiplas colunas (ex.: FOREIGN KEY (sr_item_sk, sr_ticket_number) não é suportado).

  • O AnalyticDB for MySQL não impõe restrições de dados. Valide a relação de restrição entre chaves primárias e estrangeiras em sua aplicação.

  • Não é possível adicionar restrições de chave estrangeira a tabelas externas.

Exemplo: Adicione uma chave estrangeira em store_sales referenciando a tabela item.

CREATE TABLE item
(
 i_item_sk BIGINT NOT NULL,
 i_current_price BIGINT,
 PRIMARY KEY(i_item_sk)
)
DISTRIBUTED BY HASH(i_item_sk);

CREATE TABLE store_sales
(
 ss_sale_id BIGINT,
 ss_store_sk BIGINT,
 ss_item_sk BIGINT NOT NULL,
 PRIMARY KEY(ss_sale_id)
);
ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);

Para mais informações, consulte Eliminar joins desnecessários usando restrições de chave primária e estrangeira.

Excluir uma chave estrangeira

ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol

Exemplo:

ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;

Partições

Alterar o ciclo de vida da partição

ALTER TABLE db_name.table_name PARTITIONS N

Notas de uso:

  • Em clusters com versão de kernel 3.2.4.1 ou posterior, defina N como 0 para remover o gerenciamento de ciclo de vida da partição.

  • O novo ciclo de vida entra em vigor somente após um job BUILD ser acionado e concluído. Execute SHOW CREATE TABLE db_name.table_name; para verificar.

Exemplo 1: Remova o ciclo de vida de customer.

ALTER TABLE customer PARTITIONS 0;

Exemplo 2: Altere o ciclo de vida de 30 dias para 40 dias.

ALTER TABLE customer PARTITIONS 40;

Excluir uma partição

ALTER TABLE DROP PARTITION tem o mesmo efeito que TRUNCATE TABLE PARTITION .
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)
Aviso

Excluir uma partição remove permanentemente todos os dados contidos nela. Esta ação não pode ser desfeita.

Exemplo 1: Exclua a partição 20241220 da tabela customer.

ALTER TABLE adb_demo.customer DROP PARTITION (20241220);

Exemplo 2: Exclua as partições 20241218 e 20241219.

ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);

Políticas de armazenamento

Alterar a política de armazenamento em camadas

Pré-requisitos

  • O cluster deve ser Enterprise Edition, Basic Edition, Data Lakehouse Edition ou Data Warehouse Edition (modo Elástico).

  • Requisitos de versão do kernel:

    • Tabelas XUANWU: sem restrição de versão do kernel.

    • Tabelas XUANWU_V2: a versão do kernel deve ser 3.2.2.15 ou posterior, 3.2.3.13 ou posterior, 3.2.4.9 ou posterior, ou 3.2.5.3 ou posterior.

Para visualizar e atualizar a versão secundária, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.

Para tabelas XUANWU_V2, a tarefa agendada para mover dados entre armazenamento quente e frio deve estar ativada:

  • Verifique o status: SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;

    • Se o resultado for FALSE, a tarefa está desativada e deve ser ativada.

    • Se um erro for retornado, o parâmetro não foi definido e o padrão é TRUE.

  • Ative a tarefa: SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;

ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
A nova política de armazenamento entra em vigor somente após um job BUILD ser acionado e concluído para a tabela. Por padrão, esse job é executado automaticamente em segundo plano. Antes da conclusão do job BUILD, o número de partições quentes relatado por information_schema.table_usage pode diferir da política configurada. Execute SHOW CREATE TABLE db_name.table_name; para confirmar que a política está em vigor.

Exemplo 1: Defina a política de armazenamento como COLD.

ALTER TABLE customer storage_policy = 'COLD';

Exemplo 2: Defina a política de armazenamento como HOT.

ALTER TABLE customer storage_policy = 'HOT';

Exemplo 3: Defina a política de armazenamento como MIXED com 10 partições quentes.

ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;

Perguntas frequentes

Posso alterar a ordem das colunas?

Não. A ordem das colunas não pode ser alterada no AnalyticDB for MySQL.

Como altero uma coluna VARCHAR para LONGTEXT?

Nenhuma conversão é necessária. O tipo VARCHAR no AnalyticDB for MySQL equivale aos tipos CHAR, VARCHAR, TEXT, MEDIUMTEXT e LONGTEXT do MySQL. Não há diferença funcional entre eles.

Se eu adicionar uma coluna AUTO_INCREMENT a uma tabela que já possui dados, as linhas históricas serão preenchidas?

Não. Apenas as novas linhas inseridas terão valores autoincrementados. Para preencher linhas históricas, crie uma nova tabela que inclua a coluna AUTO_INCREMENT e migre os dados para ela.

Posso alterar a chave de distribuição ou a chave de partição?

Não. O AnalyticDB for MySQL não suporta adição, exclusão ou alteração de chaves de distribuição ou partição. Para alterá-las, crie uma nova tabela e migre seus dados:

  1. Crie uma nova tabela com a chave de distribuição desejada. Exemplo: Altere a chave de distribuição de order de order_id para customer_id.

    CREATE TABLE order_auto_opt_v1 (
      order_id bigint NOT NULL COMMENT 'Order ID',
      customer_id bigint NOT NULL COMMENT 'Customer ID',
      customer_name varchar NOT NULL COMMENT 'Customer name',
      order_time timestamp NOT NULL COMMENT 'Order time',
      --Other fields are omitted.
      PRIMARY KEY (order_id,customer_id,order_time) --The distribution key customer_id and the partition key order_time must be in the primary key.
    )
    DISTRIBUTED BY HASH(customer_id)
    PARTITION BY VALUE(DATE_FORMAT(order_time, '%Y%m%d')) LIFECYCLE 90
    COMMENT 'Order information table';
  2. Importe dados da tabela de origem usando INSERT OVERWRITE SELECT. Para mais informações, consulte INSERT OVERWRITE SELECT.

    INSERT OVERWRITE order_auto_opt_v1
    SELECT * FROM order;
  3. Verifique se há skew de dados. Após a importação, confirme que a nova chave de distribuição não causa skew. Para mais informações, consulte Diagnóstico de armazenamento.

  4. Renomeie a tabela de origem para backup.

    RENAME TABLE order TO order_backup;
  5. Renomeie a nova tabela para o nome original.

    RENAME TABLE order_auto_opt_v1 TO order;

Posso adicionar ou alterar uma chave primária?

Não. As seguintes operações de chave primária não são suportadas:

  • Adicionar ou excluir uma chave primária

  • Converter uma tabela sem chave primária em uma com chave primária, ou vice-versa

  • Adicionar ou remover colunas de chave primária

  • Renomear uma coluna de chave primária

  • Alterar o tipo de dados de uma coluna de chave primária

Por que minha alteração de ciclo de vida ou política de armazenamento em camadas não entrou em vigor?

A alteração entra em vigor somente após um job BUILD ser acionado e concluído para a tabela. Execute SHOW CREATE TABLE db_name.table_name; para confirmar que as novas configurações estão ativas.

Solução de problemas

syntax error, error in: 'DISTRIBUTE BY HASH(id) PARTITION BY VAL...'

A chave primária, a chave de partição e a chave de distribuição não podem ser modificadas após a criação da tabela. Para fazer tais alterações, crie uma nova tabela e migre os dados.

Do not allow concurrent add cluster/zorder index task

Uma mensagem de erro completa é semelhante a:

Do not allow concurrent add cluster/zorder index task, which in progress: {"clusterColumnIds":[2],"clusterColumns":["phone_num"],"clusterIndexName":"index1","indexOptions":"ASC","type":"ADD_CLUSTERING_KEY"}

Causa: Você executou ALTER TABLE ... ADD CLUSTERED KEY, mas o job BUILD que o torna efetivo ainda não foi concluído. Tentar adicionar outro índice clusterizado antes que o primeiro entre em vigor aciona este erro.

Solução: Aguarde o job BUILD ser executado automaticamente ou acione um manualmente. Após a conclusão do job BUILD e a entrada em vigor do índice clusterizado, exclua o índice existente e adicione um novo para alterá-lo.

Para verificar o status do job BUILD:

SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;