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
,INSERT
eCREATE
na tabela. IGNORE
é uma extensão do MariaDB ao SQL-92. Ele controla como oALTER TABLE
funciona se houver duplicação em chaves únicas na nova tabela. SeIGNORE
não é especificado, a cópia é abortada e retornada. SeIGNORE
for 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
,DROP
eCHANGE
em 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 INDEX
sã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_nome
sem 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_create
usam a mesma sintaxe paraADD
eCHANGE
assim 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 colunaINTEGER
dea
parab
, 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
CHANGE
ainda 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
MODIFY
para alterar um tipo de coluna sem renomeá-lo:mysql>
ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
- Se você utilizar
CHANGE
ouMODIFY
para 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
CHANGE
ouMODIFY
, erter os dados para o novo tipo da melhor forma possível. - Desde o MariaDB v3.22 você pode utilizar
FIRST
ouADD ... AFTER nome_col
para 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-chaveFIRST
eAFTER
emCHANGE
ouMODIFY
. ALTER COLUMN
especifica 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 INDEX
remove 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 KEY
deleta 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 KEY
se nenhumaPRIMARY KEY
foi especificada explicitamente.)Se você adicionar
UNIQUE INDEX
ouPRIMARY KEY
a uma tabela, elas são armazenadas antes de qualquer índice nãoUNIQUE
para que possa detectar cahves duplicadas o mais rápido possível.ORDER BY
lhe 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 TABLE
em uma tabelaMyISAM
, todos os índices que não são únicos são criados em um grupo separado (como emREPAIR
). Isto deve tornarALTER TABLE
muito 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 KEYS
faz o MariaDB parar de atualizar chaves que não são únicas em tabelasMyISAM
.ALTER TABLE ... ENABLE KEYS
deve 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 (quandoIGNORE
for usado) quantos registros foram deletados devido a duplicação de valores de chaves únicas. - As cláusulas
FOREIGN KEY
,CHECK
eREFERENCES
nã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 TABLE
ignora as opções de tabelaDATA DIRECTORY
eINDEX 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 set
para 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
.".