Sintaxe ALTER TABLE
ALTER TABLE lhe permite alterar a estrutura da tabela existente. Por exemplo, você pode adicionar ou deletar colunas, criar ou remover índices, alterar o tipo de coluna existentes, ou renomear coluna ou tabelas. Você também pode alterar o comentário para a tabela e tipo de tabela. Leia "Sintaxe CREATE TABLE".
Se você utilizar ALTER TABLE para alterar a especificação da coluna, mas DESCRIBE tbl_name indicar que a sua coluna não foi alterada, é possível que o MariaDB tenha ignorado ou a sua modificação por uma das razões descritas em "Alteração de Especificações de Colunas". Por exemplo, se você tentar alterar uma coluna VARCHAR para CHAR, MariaDB ainda usará VARCHAR se a tabela conter outras colunas de tamanho variável.
ALTER TABLE funciona fazendo uma cópia temporária da tabela original. A alteração é realizada na cópia, assim a tabela original é deletada e a nova tabela é renomeada. Isto é feito de tal forma que todas as desnecessáriaatualizações são automaticamente redirecionadas para a nova tabela sem nenhuma atualização errada. Enquanto o ALTER TABLE é executado, a tabela original pode ser lida por outros clientes. Atualizações e escrita na tabela são guardadas até a nova tabela estar pronta.
Note que se você utilizar qualquer outra opção de ALTER TABLE, exceto RENAME, o MariaDB irá sempre criar um a tabela temporária, mesmo se os dados não precisarem realmente serem copiados (como quando você altera o nome de uma coluna). Planejamos corrigir isto no futuro, mas como não se faz ALTER TABLE com tanta frequência, isto não é de alta prioridade em nosso TO DO. Para tabelas MyISAM, vOcê pode aumentar a velocidade na parte da recriação dos índices (que a parte mais lenta do processo recriação) atribuindo um alto valor à variável myisam_sort_buffer_size.
- Para utilizar
ALTER TABLE, você precisa dos privilégiosALTER,INSERTeCREATEna tabela. IGNOREé uma extensão do MariaDB ao SQL-92. Ele controla como oALTER TABLEfunciona se houver duplicação em chaves únicas na nova tabela. SeIGNOREnão é especificado, a cópia é abortada e retornada. SeIGNOREfor especificado, para linhas com duplicatas em chaves únicas, somente a primera linha é usada; as outras são deletadas.- Você pode executar múltiplas cláusulas
ADD,ALTER,DROPeCHANGEem uma única instruçãoALTER TABLE. Esta é uma extensão do MariaDB ao SQL-92, que permite paenas uma cláusula de cada por instruçãoALTER TABLE. CHANGE col_name,DROP col_name, eDROP INDEXsão extensões do MariaDB ao SQL-92.MODIFYé uma extensão do Oracle paraALTER TABLE.- A palavra opcional
COLUMNé uma palavra puramente desnecessária e pode ser omitida. - Se você utilizar
ALTER TABLE nome_tbl RENAME TO novo_nomesem nenhuma outra opção, MariaDB simplesmente renomeia os arquivos correspondentes a tabelanome_tbl. Não há necessidade de se criar uma tabela temporária. Leia "SintaxeRENAME TABLE". - Cláusulas
definição_createusam a mesma sintaxe paraADDeCHANGEassim como paraCREATE TABLE. Note que a sintaxe inclui o nome da coluna, não apenas o tipo da coluna. Leia "SintaxeCREATE TABLE". - Você pode renomear ma coluna usando uma cláusula
CHANGE nome_col_antiga definições_create. Para tal, especifique o nome das colunas antiga e da nome e o tipo que a coluna atual possui. Por exemplo, para renomear uma colunaINTEGERdeaparab, faça assim:mysql>
ALTER TABLE t1 CHANGE a b INTEGER;Se você quiser mudar um tipo de coluna, mas não o nome, a sintaxe
CHANGEainda exige dois nomes de colunas, mesmo que sejam o mesmo. Por exemplo:mysql>
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;No entanto, como no MariaDB Versão 3.22.16a, você também pode utilizar
MODIFYpara alterar um tipo de coluna sem renomeá-lo:mysql>
ALTER TABLE t1 MODIFY b BIGINT NOT NULL; - Se você utilizar
CHANGEouMODIFYpara reduzir uma coluna na qual exista um índice em parte da coluna (por exemplo, se você tiver um índice nos primeiros 10 caracteres de uma colunaVARCHAR), você não poderá reduzir a coluna para um tamanho menor que o número de caracteres indexados. - Quando você altera um tipo de coluna usando
CHANGEouMODIFY, erter os dados para o novo tipo da melhor forma possível. - Desde o MariaDB v3.22 você pode utilizar
FIRSTouADD ... AFTER nome_colpara aadicionar uma coluna em uma posição específica na linha da tabela. O padrão é adicionar a coluna no fim. A partir do MariaDB Versão 4.0.1, você pode também utilizar as palavras-chaveFIRSTeAFTERemCHANGEouMODIFY. ALTER COLUMNespecifica um novo valor padrão para uma coluna ou remover o valor padrão antigo. Se o padrão antigo é removido e a coluna pode serNULL, o novo padrão éNULL. Se a coluna não pode serNULL, MariaDB atribui um valor padrão, como descrito em "SintaxeCREATE TABLE".DROP INDEXremove um índice. Esta é uma extensão do MariaDB ao SQL-92. Leia "SintaxeDROP INDEX".- Se colunas forem removidas de uma tabela, as colunas também são removidas de qualquer índice do qual eles fazem parte. Se todas as colunas que compõe um índice são excluídas, o índice também é excluído.
- Se uma tabela contém apenas uma coluna, a coluna não pode ser excluída. Se o que você pretende é remover a tabela, use
DROP TABLE. DROP PRIMARY KEYdeleta o índice primário. Se tal índice não existe, ele apaga o prmeiro índice único (UNIQUE) na tabela. (MySQL marca a primeira chave única (UNIQUE) comoPRIMARY KEYse nenhumaPRIMARY KEYfoi especificada explicitamente.)Se você adicionar
UNIQUE INDEXouPRIMARY KEYa uma tabela, elas são armazenadas antes de qualquer índice nãoUNIQUEpara que possa detectar cahves duplicadas o mais rápido possível.ORDER BYlhe permite criar a nova tabela com as linhas em uma ordem específica. Note que a tabela não permanecerá nesta ordem depois de insrções e deleções. Em algunas casos, isto pode tornar a ordenação mais para o MariaDB se a tabela estiver ordenada pela coluna que você escolheu. Esta opção é útil principalmente quando você sabe qeu na maioria das vezes você irá inserir os registros em certa ordem; utilizando esta opção depois de grandes mudanças na tabela, você obterá melhor desempenho.- Se você utilizar
ALTER TABLEem uma tabelaMyISAM, todos os índices que não são únicos são criados em um grupo separado (como emREPAIR). Isto deve tornarALTER TABLEmuito mais rápido quando você tiver vários índices. - A partir do MySQL 4.0 o recurso acima pode ser ativado explicitamente.
ALTER TABLE ... DISABLE KEYSfaz o MariaDB parar de atualizar chaves que não são únicas em tabelasMyISAM.ALTER TABLE ... ENABLE KEYSdeve ser usado para recriar índices perdidos. Como o MariaDB faz isso com um algoritmo especial que é muito mais rápido que inserir chaves uma a uma, disabilitar chaves podem trazer um aumento de velocidade considerável em inserções volumosas. - Com a função
mysql_info()da API C, você pode saber quantos registros foram copiados, e (quandoIGNOREfor usado) quantos registros foram deletados devido a duplicação de valores de chaves únicas. - As cláusulas
FOREIGN KEY,CHECKeREFERENCESnão fazem nada, exceto para tipos de tabela InnoDB que suportam... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)e... DROP FOREIGN KEY .... Leia "RestriçõesFOREIGN KEY". A sintaxe para outros tipos de tabela só é fornecido para comptibilidade, para tornar fácil portar o código de outro servidor SQL e executar aplicações que criam tabelasd com referências. Leia "Diferenças do MariaDB em Comparação com o SQL-92". ALTER TABLEignora as opções de tabelaDATA DIRECTORYeINDEX DIRECTORY.- Se você quiser alterar todas as colunas CHAR/VARCHAR/TEXT para um novo conjunto de caracteres (por exemplo, depois de atualizar do MariaDB 4.0.x para o 4.1.1) você pode fazer:
ALTER TABLE table_name CHARACTER SET character_set_name;
Note que o seguinte comando só irá alterar o
default character setpara uma tabela:ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name;
O
default character seté o conjunto de caracteres que é usado se você não especificar o conjunto de caracteres para uma nova coluna que você adicionar a tabela (por exemplo comALTER TABLE ... ADD coluna).
Aqui temos um exemplo que mostra alguns dos usos de ALTER TABLE. Nós começamos com uma tabela t1 que é crida como mostrado aqui:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Para renomear a tabela de t1 para t2:
mysql> ALTER TABLE t1 RENAME t2;
Para alterar a coluna a de INTEGER para TINYINT NOT NULL (deixando o mesmo nome), e alterar a coluna b de CHAR(10) para CHAR(20) e renomeá-la de b para c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Para adicionar um nova coluna TIMESTAMP chamada d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Para adicionar um índice na coluna d, e tornar a colua a a chave primária:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Para remover a coluna c:
mysql> ALTER TABLE t2 DROP COLUMN c;
Para adiciomar um nova coluna inteira AUTO_INCREMENT chamada c:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Note que nós indexamos c, porque colunas AUTO_INCREMENT devem ser indexadas e também por isso declaramos c como NOT NULL, pois colunas indexadas não podem ser NULL.
Quando você adicionar uma coluna AUTO_INCREMENT, valores de coluna são preenchidos com sequência de números automaticamente para você. Você pode definir o primeiro número da sequência executando SET INSERT_ID=valor antes de ALTER TABLE ou usando a opção de tabela AUTO_INCREMENT=valor. Leia "Sintaxe de SET".
Com tabelas MyISAM tables, se você não alterar a coluna AUTO_INCREMENT, a sequência de números não será afetada. Se você excluir uma coluna AUTO_INCREMENT e adicionar outra coluna AUTO_INCREMENT, a numeração iniciará a partir do 1 novamente.
See Seção A.7.1, "Problemas com ALTER TABLE.".