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:
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 |
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 |
|
|
Modo de índice de coluna completa: cria índices comuns para todas as colunas |
|
|
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 paraINDEX_ALL='N'. Apenas o índice alvo é removido; os demais permanecem inalterados.Quando
INDEX_ALL='N', o comandoSHOW CREATE TABLEpode 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 |
|
|
Crie um índice em uma coluna JSON. A coluna deve ser do tipo JSON. |
|
|
Crie um índice em uma chave de propriedade específica dentro de um objeto JSON. Para mais informações, consulte Índices JSON. |
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 |
|
|
A coluna a ser indexada. Deve ser do tipo VARCHAR. |
|
|
Opcional. Especifica o tokenizador e o dicionário personalizado. |
|
|
O analisador para o índice full-text. Consulte Analisadores para índices full-text. |
|
|
O dicionário personalizado para o índice full-text. Consulte Dicionários personalizados para índices full-text. |
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 |
|
|
O nome do índice. Para convenções de nomenclatura, consulte a seção Limites de nomenclatura. |
|
|
A coluna vetorial a ser indexada. O tipo da coluna deve ser |
|
|
O algoritmo usado para calcular a distância vetorial. Defina como |
|
|
A fórmula de distância. Defina como |
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 |
|
|
A tabela à qual a chave estrangeira será adicionada. |
|
|
Opcional. O nome da restrição de chave estrangeira — deve ser único dentro da tabela. Se omitido, o parser usa |
|
|
A coluna de chave estrangeira. Já deve existir. |
|
|
A tabela primária. Já deve existir. |
|
|
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
Ncomo0para 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 PARTITIONtem o mesmo efeito queTRUNCATE TABLE PARTITION.
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)
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 porinformation_schema.table_usagepode diferir da política configurada. ExecuteSHOW 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;