:: DEVELOPER ZONE
ALTER [IGNORE] TABLE nome_tbl especificação_alter [, especificação_alter ...]
especificação_alter:
ADD [COLUMN] definição_create [FIRST | AFTER nome_coluna ]
| ADD [COLUMN] (definição_create, definição_create,...)
| ADD INDEX [nome_indice] (index_nome_col,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
| ADD FULLTEXT [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
[definição_referncia]
| ALTER [COLUMN] nome_col {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] nome_col_antigo definição_create
[FIRST | AFTER nome_coluna]
| MODIFY [COLUMN] definição_create [FIRST | AFTER nome_coluna]
| DROP [COLUMN] nome_col
| DROP PRIMARY KEY
| DROP INDEX nome_indice
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] nome_nova_tbl
| ORDER BY col
| CHARACTER SET character_set_name [COLLATE collation_name]
| table_options
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.
See Secção 6.5.3, “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 MySQL tenha ignorado ou a sua modificação por uma das razões
descritas em Secção 6.5.3.1, “Alteração de Especificações de Colunas”. Por exemplo, se você tentar
alterar uma coluna VARCHAR para CHAR, MySQL 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 MySQL 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égios
ALTER, INSERT e CREATE na tabela.
IGNORE é uma extensão do MySQL ao SQL-92.
Ele controla como o ALTER TABLE funciona se houver duplicação em
chaves únicas na nova tabela.
Se IGNORE não é especificado, a cópia é abortada e retornada.
Se IGNORE 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
e CHANGE em uma única instrução ALTER TABLE. Esta é uma extensão
do MySQL ao SQL-92, que permite paenas uma cláusula de cada por instrução
ALTER TABLE.
CHANGE col_name, DROP col_name, e DROP INDEX
são extensões do MySQL ao SQL-92.
MODIFY é uma extensão do Oracle para ALTER 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, MySQL simplesmente renomeia os arquivos correspondentes
a tabela nome_tbl. Não há necessidade de se criar uma tabela temporária.
See Secção 6.5.5, “Sintaxe RENAME TABLE”.
Cláusulas definição_create usam a mesma sintaxe para ADD e
CHANGE assim como para CREATE TABLE. Note que a sintaxe inclui
o nome da coluna, não apenas o tipo da coluna.
See Secção 6.5.3, “Sintaxe CREATE 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 coluna
INTEGER de a para b, 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 MySQL 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 ou MODIFY 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 coluna VARCHAR), 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 ou MODIFY,
erter os dados para o novo tipo da melhor forma possível.
No MySQL Versão 3.22 ou posterior você pode utilizar FIRST ou
ADD ... 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 MySQL Versão 4.0.1, você pode também utilizar as palavras-chave
FIRST e AFTER em CHANGE ou MODIFY.
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 ser NULL, o novo
padrão é NULL. Se a coluna não pode ser NULL, MySQL atribui
um valor padrão, como descrito em Secção 6.5.3, “Sintaxe CREATE TABLE”.
DROP INDEX remove um índice. Esta é uma extensão do MySQL ao
SQL-92. See Secção 6.5.8, “Sintaxe DROP 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) como PRIMARY KEY
se nenhuma PRIMARY KEY foi especificada explicitamente.)
Se você adicionar UNIQUE INDEX ou PRIMARY KEY a uma tabela,
elas são armazenadas antes de qualquer índice não UNIQUE 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 MySQL 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 tabela MyISAM, todos os índices
que não são únicos são criados em um grupo separado (como em REPAIR).
Isto deve tornar ALTER 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 MySQL parar de atualizar chaves que
não são únicas em tabelas MyISAM.
ALTER TABLE ... ENABLE KEYS deve ser usado para recriar índices
perdidos. Como o MySQL 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 (quando IGNORE for usado) quantos registros foram
deletados devido a duplicação de valores de chaves únicas.
As cláusulas FOREIGN KEY, CHECK e REFERENCES não
fazem nada, exceto para tipos de tabela InnoDB que suportam
... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)
e ... DROP FOREIGN KEY ....
See Secção 7.5.5.2, “Restrições FOREIGN 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.
See Secção 1.8.4, “Diferenças do MySQL em Comparação com o SQL-92”.
ALTER TABLE ignora as opções de tabela DATA DIRECTORY
e INDEX DIRECTORY.
Se você quiser alterar todas as colunas CHAR/VARCHAR/TEXT para um novo conjunto de caracteres (por exemplo, depois de atualizar do MySQL 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 com ALTER 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.
See Secção 5.5.6, “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.
© 1995-2005 MySQL AB. All rights reserved.
