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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.