XOOPS Brasil

 

Definição de Dados: CREATE, DROP e ALTER





Sintaxe CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] nome_bd

CREATE DATABASE cria um banco de dados com o nome dados.

As regras para os nomes de banco de daddos permitidos são daods em Seção 6.1.2, “Nomes de Banco de dados, Tabela, Índice, Coluna e Alias”. Um erro ocorre se o banco de dados já existir e você não especificou IF NOT EXISTS.

Banco de dados no MySQL são implementados como diretórios contendo arquivos que correspondem a tabelas no banco de dados. Por não haver tabelas em um banco de dados quando ele é criado, a instrução CREATE DATABASE apenas cria um diretório sob o diretório de dados do MySQL.

Você também pode criar banco de dados com mysqladmin. Veja mais informações sobre isto na Seção 4.9, “Utilitários e Scripts do Lado do Cliente MySQL”.

6.5.2. Sintaxe DROP DATABASE

DROP DATABASE [IF EXISTS] nome_bd

DROP DATABASE deleta todos as tabelas no banco de dados e deleta o banco de dados. Se você fizer um DROP DATABASE em um banco de dados ligado simbolicamente, o link e o banco de dados original são deletados. Tenha cuidado com este comando!

DROP DATABASE retorna o número de arquivos que foram removidos do diretorio de banco de dados. Para tabelas MyISAM, isto é três vezes o número de tabelas, pois cada tabela corresponde a um arquivo .MYD, um arquivo .MYI e um arquivo .frm.

O comando DROP DATABASE remove do diretório de banco de dados dado todos os arquivos com a seguinte extensão:

ExtExtExtExt
.BAK.DAT.HSH.ISD
.ISM.ISM.MRG.MYD
.MYI.db.frm 

Todos os subdiretórios que consistem de 2 digitos (diretórios RAID) também são removidos.

No MySQL Versão 3.22 ou posterior, você pode utilizar a palavra chave IF EXISTS para prevenir da ocorrência de um erro se o banco de dados não existir.

Você também pode deletar um banco de dados com mysqladmin. Veja mais informações sobre isto na Seção 4.9, “Utilitários e Scripts do Lado do Cliente MySQL”.

6.5.3. Sintaxe CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nome_tabela [(definição_create,...)]
[table_options] [select_statement]
ou
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nome_tabela [(]LIKE nome_antigo_tabela[)];
definição_create:
nome_coluna tipo [NOT NULL | NULL] [DEFAULT valor_padrão] [AUTO_INCREMENT]
[[PRIMARY] KEY] [COMMENT 'string'] [definição_referência]
| [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| KEY [nome_indice] (index_nome_coluna,...)
| INDEX [nome_indice] (index_nome_coluna,...)
| [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] (index_col_name,...)
| FULLTEXT [INDEX] [nome_indice] (index_nome_coluna,...)
| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
[definição_referência]
| CHECK (expr)
tipo:
TINYINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| INT[(tamanho)] [UNSIGNED] [ZEROFILL]
| INTEGER[(tamanho)] [UNSIGNED] [ZEROFILL]
| BIGINT[(tamanho)] [UNSIGNED] [ZEROFILL]
| REAL[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| FLOAT[(tamanho,decimais)] [UNSIGNED] [ZEROFILL]
| DECIMAL(tamanho,decimais) [UNSIGNED] [ZEROFILL]
| NUMERIC(tamanho,decimais) [UNSIGNED] [ZEROFILL]
| CHAR(tamanho) [BINARY | ASCII | UNICODE]
| VARCHAR(tamanho) [BINARY]
| DATE
| TIME
| TIMESTAMP
| DATETIME
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT
| TEXT
| MEDIUMTEXT
| LONGTEXT
| ENUM(value1,value2,value3,...)
| SET(value1,value2,value3,...)
index_nome_coluna:
nome_coluna [(tamanho)] [ASC | DESC]
definição_referência:
REFERENCES nome_tabela [(index_nome_coluna,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE opção_referência]
[ON UPDATE opção_referência]
opção_referência:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
opções_tabela: table_option [table_option] ...
opções_tabela:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
| AUTO_INCREMENT = #
| AVG_ROW_LENGTH = #
| CHECKSUM = {0 | 1}
| COMMENT = 'string'
| MAX_ROWS = #
| MIN_ROWS = #
| PACK_KEYS = {0 | 1 | DEFAULT}
| PASSWORD = 'string'
| DELAY_KEY_WRITE = {0 | 1}
| ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED }
| RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=#
| UNION = (table_name,[table_name...])
| INSERT_METHOD = { NO | FIRST | LAST }
| DATA DIRECTORY = 'caminho absluto para o diretório'
| INDEX DIRECTORY = 'caminho absluto para o diretório'
| DEFAULT CHARACTER SET character_set_name [COLLATE collation_name]
instrução_select:
[IGNORE | REPLACE] [AS] SELECT ... (Alguma instrução válida)

CREATE TABLE cria uma tabela com op nome dado no banco de dados atual.

As regras para nomes de tabelas permitidos são dados em Seção 6.1.2, “Nomes de Banco de dados, Tabela, Índice, Coluna e Alias”. Por padrão a tabela é criada no banco de dados atual. Um erro ocorre se não houver o banco de dados atual ou se a tabela já existir.

No MySQL Versão 3.22 ou posterior, o nome de tabela pode ser especificado como nome_bd.nome_tabela para criar a tabela em um banco de dados específico. Ele funciona sem se preoocupar se existe um banco de dados atual.

A partir do MySQL Versão 3.23, você pode usar a palavra-chave TEMPORARY qaundo você criar uma tabela. A tabela temporária é visível apenas a para a conexão atual, e será automaticamente deletada quando a conexão é fechada. Isto significa que duas conexões diferentes podem usar o mesmo nome de tabela temporária sem conflitos outras ou com uma tabela existente com o mesmo nome. (A tabela existente é escondida até que a tabela temporária seja deletada). A partir do MySQL 4.0.2 você deve ter o privilégio CREATE TEMPORARY TABLES para poder criar tabelas temporárias.

No MySQL Versão 3.23 ou posterior você pode utilizar as palavras-chaves IF NOT EXISTS para que não ocorra um erro se a tabela já existir. Note que não há verificação de que a tabela existente tem uma estrutura idêntica a aquela indicada pela instrução CREATE TABLE

A partir da versão 4.1.0, o atributo SERIAL pode ser usado com um apelido para BIGINT NOT NULL AUTO_INCREMENT UNIQUE. Este é um recuros para compatibilidade.

Como no MySQL 3.23, você pode criar uma tabela de autra adicionando uma instrução SELECT no fim da instrução CREATE TABLE:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

Os índices não são transportados para a nova tabela, e algumas conversões de tipos de coluna podem ocorrer. Por exemplo, o atributoAUTO_INCREMENT não está preservado e colunas VARCHAR podem se tornar colunas CHAR.

Quando criar uma tabela com CREATE ... SELECT, de um apelido para qualquer chamada de função ou expressões em uma consulta. Se você não o fizer, a instrução CREATE pode falhar ou resultar em nomes de colunas indesejáveis.

CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;

No MySQL 4.1, você pode especificar explicitamente o tipo para uma coluna gerada:

CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;

No MySQL 4.1 você pode utilizar LIKE para criar uma tabela baseada em uma definição de outra tabela. No MySQL 4.1 você também pode especificar o tipo para uma coluna gerada:

CREATE TABLE new_tbl LIKE orig_tbl;

Cada tabela nome_tabela é representada por algum arquivo no diretório de banco de dados. No caso das tabelas tipo MyISAM você irá obter:

CREATE TABLE ... LIKE não copia nenhuma opção de tabela DATA DIRECTORY ou INDEX DIRECTORY que foi especificada para a tabela original.

ArquivoProposito
nome_tabela.frmArquivo de formato (definição) da tabela.
nome_tabela.MYDArquivo de dados
nome_tabela.MYIArquivo Índice

Para mais informações de propriedades de varios tipo de coluna, veja Seção 6.2, “Tipos de Campos”:

  • Se nem NULL nem NOT NULL for especificado, a coluna é tratada como se NULL fosse especificado.

  • Uma coluna integer pode ter o atributo adicional AUTO_INCREMENT. Quando você insere um valor de NULL (recomendado) ou 0 em uma coluna AUTO_INCREMENT indexada, a coluna é definida com o valor da próxima sequência. Normalmente ele é valor+1, onde valor é o maior valor para a coluna column atualmente na tabela. A sequência de AUTO_INCREMENT começa com 1. Veja mais informações sobre isto na Seção 12.1.3.32, “mysql_insert_id().

    A partir do MySQL 4.1.1, especificando o parâmetro NO_AUTO_VALUE_ON_ZERO para a opção do servidor --sql-mode ou a variável do servidor sql_mode permite que você aramzene 0 nas colunas AUTO_INCREMENT como 0, em vez de gerar uma nova sequência de valores. Veja mais informações sobre isto na Seção 4.1.1, “Opções de Linha de Comando do mysqld.

    Se você deletar a linha contendo o valor máximo para uma coluna AUTO_INCREMENT, o valor será reutilizado por uma tabela ISAM, ou BDB, mas não por tabelas MyISAM ou InnoDB. Se você deletar todas as linhas na sua tabela com DELETE FROM nome_tabela (sem um WHERE) no modo AUTOCOMMIT, a sequencia será reiniciada em todos os tipos de tabela, exceto InnoDB. Veja mais informações sobre isto na Seção 7.5.12.5, “Como Funciona uma Coluna AUTO_INCREMENT no InnoDB”.

    Nota: Só pode haver uma coluna AUTO_INCREMENT por tabela, e ela deve ser indexada e não pode ter uma valor DEFAULT. No MySQL Versão 3.23, uma coluna AUTO_INCREMENT funcionará corretamente apenas se conter apenas valores positivos. Inserir um número negativo é considerado como a inserção de um número positivo muito grande. Isto ocorre para evitar problemaa de precisão quando os números vão de positivo para negativo e também para assegurar que não se obtenha, acidentalmente, uma coluna AUTO_INCREMENT que contenha 0.

    Em tabelas MyISAM e BDB você pode especificar colunas AUTO_INCREMENT secundárias em uma chave ulti-coluna. Veja mais informações sobre isto na Seção 3.6.9, “Usando AUTO_INCREMENT.

    Para tornar MySQL compatível com alguns aplicativos ODBC, você pode encontrar o valor AUTO_INCREMENT da última linha inserida com a seguinte consulta:

    SELECT * FROM nome_tabela WHERE auto_col IS NULL
    
  • Valores NULL são tratados em colunas TIMESTAMP de modo diferente de outros tipos de colunas. Você não pode armazenar um NULL literal em uma coluna TIMESTAMP; definindo a coluna com NULL lhe atribui a a data e a hora atual. Como colunas TIMESTAMP se comportam desta forma, os atributos NULL e NOT NULL não se aplicam de modo normal e são ignorados se você os especificar.

    Por outro lado, tornar o uso de colunas TIMESTAMP mais fácil para os clientes MySQL, o servidor relata que tal coluna pode ter o valor NULL atribuído (a que é verdade), mesmo que TIMESTAMP nunca contenham, realmente, um valor NULL. Você pode ver isto quando você utiliza DESCRIBE nome_tabela para obter informações sobre sua tabela.

    Note que definir uma coluna TIMESTAMP com 0 não é o mesmo que definí-la com NULL, porque 0 é um valor TIMESTAMP válido.

  • Um valor padrão (DEFAULT) tem que ser constante, ele não pode ser uma função ou uma expressão.

    Se nenhum valor DEFAULT é especificado para uma coluna, o MySQL atribuirá um automaticamente, como a seguir.

    Se a coluna aceitar NULL como um valor, o valor padrão é NULL.

    Se a coluna é declarada como NOT NULL, o valor padrão depende do tipo de coluna:

    • Para tipos numéricos não declarados com o atributo AUTO_INCREMENT, o padrão é 0. Para uma coluna AUTO_INCREMENT, o valor padrão é o próximo valor na sequência.

    • Para tipos date e time diferentes de TIMESTAMP, o padrão é o valor zero apropriado para o tipo. Para a primeira coluna TIMESTAMP na tabela, o padrão é a data e hora atuais. Veja mais informações sobre isto na Seção 6.2.2, “Tipos de Data e Hora”.

    • Para tipos string diferentes de ENUM, o valor padrão é uma string vazia. Para ENUM, o padrão é o primeiro valor enumerado.

    Valores padrões devem ser constantes. Isto significa, por exemplo, que você não pode definir o padrão de uma coluna date como o valor de funções como NOW() or CURRENT_DATE.

  • Um comentário para uma coluna pode ser especificado com a opção COMMENT. O comentário é mostrado pela instrução SHOW CREATE TABLE e por SHOW FULL COLUMNS. Esta opção está disponível a partir do MySQL 4.1. (Ela é perimitida mas ignorada em versões anteriores.)

  • KEY é normalmente um sinônimo para INDEX. A partir da versão 4.1, o atributo de chave PRIMARY KEY também pode ser especificado apenas como KEY. Isto foi implementado para compatibilidade com outros bancos de dados.

  • No MySQL,uam chave UNIQUE só pode ter valores distintos. Um erro ocorre se você tantar adicionar uma nova linha com uma chave que coincida com uma já existente.

  • PRIMARY KEY é uma chave única (KEY) onde todas as colunas chaves devem ser definidas como NOT NULL. Se elas não forem explicitamente declaradas como NOT NULL, isto será feito implicitamente e sem aviso. No MySQL a chave é chamada PRIMARY. Uma tabela pode ter apenas uma PRIMARY KEY. Se você não tiver uma PRIMARY KEY e alguma aplicação perguntar pela PRIMARY KEY em sua tabela, o MySQL retornará a primeira chave UNIQUE, que não possui nenhuma coluna NULL, como a PRIMARY KEY.

  • Uma PRIMARY KEY pode ser um índice multi-coluna. Porém, você não pode criar um índice multi-coluna usando o atributo de chave PRIMARY KEY em uma especificação de coluna. Fazendo assim apenas colunas simples poderão ser marcadas como primárias. Você deve utilizar uma cláusula PRIMARY KEY(index_nome_coluna, ...) separada.

  • Um índice UNIQUE é aquele no qual todos os valores no índice devem ser distintos. A exceção a isto é que se for permtido conter valores NULL em uma coluna no índice, ele pode conter múltiplos valores NULL. Este exceção não se aplica a tabelas BDB, que permitem apenas um único NULL.

  • Se a chave PRIMARY ou UNIQUE consistir de apenas uma coluna e ela é do tipo inteiro, você também poderá se referir a ela como _rowid (novo na versão 3.23.11).

  • Se você não atribuir um nome ao índice que não é um PRIMARY KEY, ele terá o mesmo nome da prmeira index_nome_coluna, com um sufixo opicional (_2, _3, ...) para torná-lo único. Você pode nome de índices para uma tabela usando SHOW INDEX FROM nome_tabela. Veja mais informações sobre isto na Seção 4.6.8.1, “Recuperando Informações sobre Bancos de Dados, Tabelas, Colunas e Índices”.

  • Apenas os tipos de tabelas MyISAM, InnoDB, e BDB suportam índices em coluna que possam ter valores NULL. Nos outros casos você deve declarar tais colunas NOT NULL ou um erro será retornado.

  • Com a sintaxe nome_coluna(length) em uma especificação de índice, você pode criar um índice que utiliza apenas os primeiros length() bytes de uma coluna CHAR ou VARCHAR. Isto pode tornar o arquivo de índices muito menor. Veja mais informações sobre isto na Seção 5.4.4, “Índices de Colunas”.

  • Apenas os tipos de tabela MyISAM e (a partir do MySQL 4.0.14) InnoDB suportam índice em colunas BLOB e TEXT. Ao colocar um índice em uma coluna BLOB ou TEXT você sempre DEVE especificar o tamanho do índice, até 255 bytes. Por exemplo:

    CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
    

  • Uma especificação index_col_name pode finalizar com ASC ou DESC. Esta palavras chaves são permitidas para estensão futura para especificar o armazenamento do valor do índice em crescente ou decrescente. Atualmente elas são analisadas mas ignoradas; valores de índice são sempre armazenados em ordem crescente.

  • Quando você utiliza ORDER BY ou GROUP BY com uma coluna TEXT ou BLOB, o servidor ardena valores usando apenas o número inicial de bytes, indicado pela variável do servidor max_sort_length. Veja mais informações sobre isto na Seção 6.2.3.2, “Os Tipos BLOB e TEXT.

  • No MySQL Versão 3.23.23 ou posterior, você também pode criar índices FULLTEXT especiais. Eles são usados para busca full-text. Apenas o tipo de tabela MyISAM suporta índices FULLTEXT. Eles só podem ser criados em colunas CHAR, VARCHAR, e TEXT. A indexação sempre ocorre sobre toda a coluna; índices parciais não são suportados. Veja Seção 6.8, “Pesquisa Full-text no MySQL” para detalhes de operação.

  • No MySQL Versão 3.23.44 ou posterior, tabelas InnoDB suportam verificação de chaves estrangeiras. Veja mais informações sobre isto na Seção 7.5, “Tabelas InnoDB. Note que a sintaxe FOREIGN KEY no InnoDB é mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada devem ser nomeadas explicitmente. O InnoDB suporta ambas as ações ON DELETE e ON UPDATE em chaves esrtrangiras nos MySQL 3.23.50 e 4.0.8, respectivamente. Veja a seção InnoDB do manual para a sintaxe precisa. Veja mais informações sobre isto na Seção 7.5.5.2, “Restrições FOREIGN KEY. Para outros tipos de tabelas, MySQL Server analisa as sinatxes FOREIGN KEY, CHECK e REFERENCES no comando CREATE TABLE, mas sem tal ação ser tomada. Veja mais informações sobre isto na Seção 1.8.4.5, “Chaves Estrangeiras”.

  • Para tabelas ISAM e MyISAM, cada coluna NULL tem um bit extra, arredondado para o byte mais próximo. O tamanho máximo de um registro em bytes pode ser calculado como a seguir:

    tamanho da linha = 1
    + (soma do tamanho da coluna)
    + (números de coluna NULL + delete_flag 7)/8
    + (número de colunas de tamanho variável)
    

    delete_flag é 1 para tabelas com formato de registro estático. Tabelas estáticas usam um bit no registro para um parâmetro que indica se o linha foi deletada. delete_flag é 0 para tabelas dinâmicas porque este parâmetro é armazenado no cabeçalho da linha dinâmica.

    Estes cálculos não se aplicam à tabelas InnoDB, para a qual o tamanho do armazenamento não é diferente para colunas NULL comparados a colunas NOT NULL.

  • A opçao opção_tabela e SELECT só são implmentadas no MySQL Versão 3.23 e acima.

    A opção TYPE para especificar o tipo de tabela possui os seguintes valores:

    Tipo de tabelaDescrição
    BDB ou BerkeleyDBTabelas de transação segura com bloqueio de página. Veja mais informações sobre isto na Seção 7.6, “Tabelas BDB ou BerkeleyDB.
    HEAPOs dados desta tabela são armazenados apenas na memória. Veja mais informações sobre isto na Seção 7.4, “Tabelas HEAP.
    ISAMO mecanismo de armazenamento original. Veja mais informações sobre isto na Seção 7.3, “Tabelas ISAM.
    InnoDBTabelas com transações eguras com bloqueio de linha. Veja mais informações sobre isto na Seção 7.5, “Tabelas InnoDB.
    MERGEUma coleção de tabelas MyISAM usadas como uma tabela. Veja mais informações sobre isto na Seção 7.2, “Tabelas MERGE.
    MRG_MyISAMUm apelido para tabelas MERGE
    MyISAMO novo mecanismo de armazenamento portável binário que substitui o ISAM. Veja mais informações sobre isto na Seção 7.1, “Tabelas MyISAM.

    Veja mais informações sobre isto na Capítulo 7, Tipos de Tabela do MySQL.

    Se um tipo de tabela é especificado, e este tipo não está disponível, MySQL irá usar MyISAM. Por exemplo, se uma definição de tabela inclui a opção TYPE=BDB mas o MySQL não suporta tabelas BDB, a tabela será criada como uma tabela MyISAM. Isto torna possível de se ter uma configuração de replicação onde você tem tabelas transacionaisno master mas as tabelas criadas no slave são não transacionais (para obter mais velocidade). No MySQL 4.1.1 você obtém um aviso se o tipo de tabela especificado não é aceito.

    Os outros tipos de tabelas são utilizados para otimizar o comportamento da tabela. Na maioria dos casos, você não precisa especificar nenhuma delas. As opções funcionam com todos os tipos, a menos que haja indicação:

    OpçãoDescrição
    AUTO_INCREMENTO próximo valor AUTO_INCREMENT que você quer definir em sua tabela (apenas MyISAM; para definir o primeiro valor auto incrementeem uma tabela InnoDB insira uma linha com um valor de menos um e delete esta linha).
    AVG_ROW_LENGTHUma aproximação do tamanho médio de linha em sua tabela. Você só precisa definí-la para tabelas grnades com tamanho de registros variáveis.
    CHECKSUMDefina com 1 se você quiser manter um checksum para todas as linha (deixa a tabela um pouco mais lenta para atualizações, mas fica mais fácil encontrar tabelas corrompidas) (apenas MyISAM).
    COMMENTUm comentário de 60 caracteres para a sua tabela.
    MAX_ROWSNúmero máximo de linhas que você deseja armazenar na tabela.
    MIN_ROWSNúmero mínimo de linha que você planeja armazenar na tabela.
    PACK_KEYSDefina com 1 se você quiser um índice menor, Normalmente torna a atualização mais lenta e a leitura mais rápida (apenas MyISAM e ISAM). Definr com 0 irá desabilitar empacotamento das chaves. Definir com DEFAULT (MySQL 4.0) dirá ao mecanismo de armazenamento para empacotar apenas colunas CHAR/VARCHAR longas.
    PASSWORDCriptografa o arquivo .frm com uma senha. Esta opção não fa nada na versão padrão do MySQL.
    DELAY_KEY_WRITEDefina com 1 se quiser atrasar a atualização das chaves da tabela até que a tabela seja fechada (apenas MyISAM).
    ROW_FORMATDefine como as linhas devem ser armazenadas. Atualmente esta opção só funciona com tabelas MyISAM, as quais suportam os formatos de linha DYNAMIC e FIXED. Veja mais informações sobre isto na Seção 7.1.2, “Formatos de Tabelas MyISAM.

    Quando você utiliza uma tabela MyISAM, MySQL usa o produto de MAX_ROWS * AVG_ROW_LENGTH para decidir o tamanho da tabela resultante. Se você não especificar qualquer uma das opções acima, o tamanho máximo de uma tabela será 4G (ou 2G se o seu sistema operacional só suporta tabelas de 2G). A razão para isto é apenas manter o tamanho dos ponteiros baixo para tornar o índice menor e mais rápido se você realmente não precisa de tabelas grandes.

    Se você não utilizar PACK_KEYS, o padrão é só empacotar strings, não números. Se você utilizar PACK_KEYS=1, números também serão empacotados.

    Ao empacotar chaves numéricas binárias, o MySQL usará a compactação prefixada. Isto significa que você só terá grandes benefícios disto se você tiver muitos números iguais. Compactação prefixada significa que toda a chave precisa de um byte extra para indicar quantos bytes das caves anteriores são o mesmo da próxima chave (note que o ponteiro para a linha é armazenado na ordem do byte mais alto em primeiro diretamente depois da chave, para aumentar compactação). Isto significa que se você tiver muitas chaves iguais em duas linhas consecutivas, todas os chaves ``iguais'' seguintes irão normalmente ter apenas 2 bytes (incluindo o ponteiro para a linha). Compare isto isto ao caso comum onde as chaves seguintes irão levar tamanho_armazenamento_chave + tamanho_ponteiro (nomralmente 4). Por outro lado, se todas as chaves são totalmente diferente, você usará 1 byte por chave, se a chave não puder ter valores NULL. (Neste caso o tamanho da chave empacotada será armazenado no mesmo byte que é usado para marcar se a chave é NULL.)

  • No MySQL 3.23, Se você especificar um SELECT depois de uma instrução CREATE, MySQL criará novos campos para todos os elemento em SELECT. Por exemplo:

    mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    -> PRIMARY KEY (a), KEY(b))
    -> TYPE=MyISAM SELECT b,c FROM test2;
    

    Isto irá criar uma tabela MyISAM com três colunas, a, b e c. Note que as colunas da instrução SELECT são inseridas do lado correto da tabela, nào sobreposta nela. Considere o seguinte exemplo:

    mysql> SELECT * FROM foo;
    +---+
    | n |
    +---+
    | 1 |
    +---+
    mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
    Query OK, 1 row affected (0.02 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    mysql> SELECT * FROM bar;
    +------+---+
    | m | n |
    +------+---+
    | NULL | 1 |
    +------+---+
    1 row in set (0.00 sec)
    

    Para cada linha na tabela foo, uma linha é inserida em bar com os valores de foo e os valores padrões para a nova coluna.

    CREATE TABLE ... SELECT não irá criar automaticamente nenhum índice para você. Isto é feito intencionalmente para deixar o comando o mais flexível possível. Se você quiser ter índices em uma tabela criada, você deve especificá-lo antes da instrução SELECT:

    mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
    

    Se ocorrer qualquer erro durante enquanto os dados são copiados para a tabela, ele será automaticamente deletado.

    Você pode preceder o SELECT por IGNORE ou REPLACE para indicar como tratar registros que duplicam valores de chave única. Com IGNORE, novos registros que duplicam um registro existente em um valor de chave única são descartados. Com REPLACE, novos registros substituem registros que tem o mesmo valor de chave única. Se nem IGNORE nem REPLACE são especificados, valir de chave unica duplicados resultam em erro.

    Para assegurar que o log binário/atualização pode ser usado para recriar a tabela original, MySQL não permitirá inserções concorrentes durante um CREATE TABLE ... SELECT.

  • A opção RAID_TYPE irá ajudá-lo a exceder o limite de 2G/4G limit para arquivo de dados MyISAM (não o arquivo de índice) em sistemas operacionais que não suportam arquivos grandes. Note que esta opção não é recomendada para sistema de arquivos que suportam arquivos grandes!

    Você pode obter mais velocidade da gargalo de E/S colocando diretorios RAID em diferentes discos físicos. RAID_TYPE funcionará em qualquer sistema operacional, desde que você tenha configurado o MySQL com --with-raid. Por agora o único RAID_TYPE permitido é STRIPED (1 e RAID0 são utilizados para isto).

    Se você especificar RAID_TYPE=STRIPED para tabeals MyISAM, MyISAM criará subdiretórios RAID_CHUNKS chamados 00, 01, 02 no diretório de banco de dados. Em cada um destes diretórios MyISAM criará uma nome_tabela.MYD. Ao escrever dados no arquivo de dados, o manipulador RAID irá mapear o primeiro RAID_CHUNKSIZE *1024 bytes para o primeiro arquivo e os próximos RAID_CHUNKSIZE *1024 bytes para o próximo arquivo.

  • UNION é utilizado quando você quer utilizar uma coleção de tabelas identicas como uma. Isto só funciona com tabelas MERGE. Veja mais informações sobre isto na Seção 7.2, “Tabelas MERGE.

    No momento você precisa ter privilégios SELECT, UPDATE e DELETE nas tabelas mapeadas para uma tabela MERGE. Todas as tabelas mapeadas devem estar no mesmo banco de dados na tabela MERGE.

  • Se você quiser inserir dados em uma tabela MERGE, você tem que especificar com INSERT_METHOD na tabela onde o registro deve ser inserido. INSERT_METHOD é uma opção útil somente para tabelas MERGE. Veja mais informações sobre isto na Seção 7.2, “Tabelas MERGE. Esta opção foi introduzida no MySQL 4.0.0.

  • Na tabela criada a chave PRIMARY será colocado primeiro, seguida de todas a chaves únicas (UNIQUE) e então das chaves normais. Isto ajuda o otimizador MySQL para priorizar qual chave utilizar e também a detectaa mais rapidamente chaves únicas (UNIQUE) duplicadas.

  • Utilizando DATA DIRECTORY='directorio' ou INDEX DIRECTORY='directorio' você pode especificar onde o mecanismo de armazenamento deve colocar os seus arquivos de tabelas e índices. Note que ``diretório'' deve ser um caminho completo para o diretório (não um caminho relativo).

    Isto só funciona para tabelas MyISAM no MySQL 4.0, quando não estiver usando a opção --skip-symlink. Veja mais informações sobre isto na Seção 5.6.1.2, “Utilizando Links Simbólicos para Tabelas”.

6.5.3.1. Alteração de Especificações de Colunas

Em alguns casos, MySQL altera sem aviso uma especificação de coluna dada em uma instrução CREATE TABLE. (Isto também pode ocorrer com ALTER TABLE.):

  • Colunas VARCHAR com um tamanho menor que quatro são alteradas para CHAR.

  • Se qulquer coluna em uma tabela tem um tamanho variável, toda a linha é de tamanho varável como resultado. Consequentementem se uma tabela contém qualquer coluna de tamanho variável (VARCHAR, TEXT, ou BLOB), todas as colunas CHAR maior que três caracteres são alteradas para colunas VARCHAR. Isto não afeta como você utiliza as colunas; no MySQL, VARCHAR é apenas um modo diferente de armazenar caracteres. O MySQL realiza esta conversão porque ela salva espaço e torna as operções de tabela mais rápidas. Veja mais informações sobre isto na Capítulo 7, Tipos de Tabela do MySQL.

  • A partir da versão 4.1.0, se um campo CHAR ou VARCHAR com uma especificação de tamanho maior que 255 é convertido para TEXT. Este é um recurso para compatibilidade.

  • O tamanho do display TIMESTAMP deve ser para e na faixa de 2 a 14. Se você especificar um tamanho de display de 0 opu maior que 14, o tamaho é convertido para 14. Tamanhos de valor ímpar na faixa de 1 a 13 são convertidos para o número para mais próximo acima.

  • Você não pode armazenar um NULL literal em uma coluna TIMESTAMP; definí-la com NULL a atribui a data e hora atual. Por colunas TIMESTAMP comportarem deste modo, os atributos NULL e NOT NULL não se aplicam no modo normal e são ignorados se você especificá-los. DESCRIBE nome_tabela sempre indica que a uma coluna TIMESTAMP pode ser atribuído valores NULL.

  • MySQL mapeia certos tipos de colunas utilizados por outros produtos de banco de dados para tipos MySQL. Veja mais informações sobre isto na Seção 6.2.5, “Usando Tipos de Colunas de Outros Mecanismos de Banco de Dados”.

Se você quiser ver se o MySQL utiliza um tipo de coluna diferente do especificado, axecute uma instrução DESCRIBE nome_tabela depois de criar ou alterar a sua tabela.

Outras alterações de tipos de colunas podem ocorrer se você compactar a tabela utilizando myisampack. Veja mais informações sobre isto na Seção 7.1.2.3, “Características de Tabelas Compactadas”.

6.5.4. Sintaxe ALTER TABLE

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. Veja mais informações sobre isto na Seçã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 Seçã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. Veja mais informações sobre isto na Seçã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. Veja mais informações sobre isto na Seçã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 Seção 6.5.3, “Sintaxe CREATE TABLE.

  • DROP INDEX remove um índice. Esta é uma extensão do MySQL ao SQL-92. Veja mais informações sobre isto na Seçã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 .... Veja mais informações sobre isto na Seçã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. Veja mais informações sobre isto na Seçã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. Veja mais informações sobre isto na Seçã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.

Veja mais informações sobre isto na Seção A.7.1, “Problemas com ALTER TABLE.”.

6.5.5. Sintaxe RENAME TABLE

RENAME TABLE nome_tabela TO novo_nome_tabela[, nome_tabela2 TO novo_nome_tbl2,...]

A renomeação é feita automicamente, o que significa que nenhuma outra thread pode acessar qualquer uma das tabelas enquanto a renomeação está sendo exectuda. Isto torna possível substituir uma tabela por uma tabela vazia:

CREATE TABLE tabela_nova (...);
RENAME TABLE tabela_antiga TO tabela_backup, tabela_nova TO tabela_antiga;

A renomeação é feita da esquera para a direita, o que significa que se você quiser trocar os nomes das tabelas, você deve fazer:

RENAME TABLE tabela_antiga TO tabela_backup,
tabela_nova TO tabela_antiga,
tabela_backup TO tabela_nova;

Desde que dois banco de dados estejam no mesmo disco você pode renomear de um banco de dados para outro:

RENAME TABLE bd_atual.nome_tabela TO outro_bd.nome_tabela;

Quando você executa RENAME, você não pode ter nenhuma tabela bloqueada ou transações ativas. Você também deve ter o privilégio ALTER e DROP na tabela original e o privilégio CREATE e INSERT na nova tabela.

Se o MySQL encontrar qualquer erro uma renomeação multi-tabela, ele fará um renomeação reversa para todas a tabelas renomeadas para retornar tudo ao estado original.

RENAME TABLE foi adicionado no MySQL 3.23.23.

6.5.6. Sintaxe DROP TABLE

DROP [TEMPORARY] TABLE [IF EXISTS] nome_tabela [, nome_tabela,...] [RESTRICT | CASCADE]

DROP TABLE remove uma ou mais tabelas. Todos os dados e definições de tabela são removidos, assim tenha cuidado com este comando!

No MySQL Versão 3.22 ou posteriorm você pode usar a palavra-chave IF EXISTS para prevenir um erro de ocorrer se não existir a tabela. Na versão 4.1 consegue-se um NOTA para todas as tabelas não esistentes se for usado IF EXISTS. Veja mais informações sobre isto na Seção 4.6.8.9, “SHOW WARNINGS | ERRORS.

RESTRICT e CASCADE são permitidos para portação se tornar tornar mais fácil. No momento eles não fazem nada.

Nota: DROP TABLE fará automaticamente um commit da transação ativa atualmente (exceto se você estiver usando a versão 4.1 e a palavra-chave TEMPORARY.

A opcão TEMPORARY é ignorada na versão 4.0. Na versão 4.1 esta opção funciona como a seguir:

  • Só apaga tabelas temporárias.

  • INão finaliza uma transação em execução.

  • Nenhum direito de acesso é verificado.

Usar TEMPORARY é uma boa maneira de assegurar que você não apague uma tabela real.

6.5.7. Sintaxe CREATE INDEX

CREATE [UNIQUE|FULLTEXT] INDEX nome_indice
ON nome_tabela (index_col_name,...)
index_col_name:
col_name [(length)] [ASC | DESC]

A instrução CREATE INDEX não faz nada em versões do MySQL anterior a 3.22. Na versão 3.22 ou posteriores, CREATE INDEX é mapeado para uma instrução ALTER TABLE para criar índices. Veja mais informações sobre isto na Seção 6.5.4, “Sintaxe ALTER TABLE.

Normalmente você cria todos os índices em uma tabela ao mesmo tempo em que a própria tabela é criada com CREATE TABLE. Veja mais informações sobre isto na Seção 6.5.3, “Sintaxe CREATE TABLE. CREATE INDEX lhe permite adicionar índices a tabelas existentes.

Uma lista de colunas na forma (col1,col2,...) cria um índice com múltiplas colunas. Valores de índice são formados concatenando os valores de colunas dadas.

Para colunas CHAR e VARCHAR, índices que utilizam apenas parte da coluna podem ser criados, usando a sintaxe nome_coluna(length) para indexar os primeiros length() bytes de cada valor da coluna. (Para colunas BLOB e TEXT, um prefixo length é exigido; length() pode ter um valor até 255 caracteres.) A instrução mostrada aqui cria um índice usando os primeiros 10 caracteres da coluna name:

mysql> CREATE INDEX part_of_name ON customer (name(10));

Como a maioria dos nomes normalmente diferem nos primeiros 10 caracteres, este índice não deve ser muito menor que um índice criado com toda a coluna name. Além disso, usar colunas parciais como índices pode fazer o arquivo de índice muito menor, o que pode economizar muito espaço em disco e pode também aumentar a velocidade de operações INSERT!

Note que você pode adicionar um índice em uma coluna que pode ter valores apenas se você estiver usando o MySQL Versão 3.23.2 ou mais novo e estiver usando os tipos de tabelas MyISAM, InnoDB, ou BDB. Você só pode adicionar um índice em uma coluna BLOB/ TEXT se você estiver usando o MySQL Versão 3.23.2 ou mais novo e estiver usando os tipos de tablea MyISAM ou BDB, ou MySQL Versão 4.0.14 ou mais novo e o tipo de tabela InnoDB. Para um índice em uma coluna BLOB/TEXT, o tamanho do prefixo sempre deve ser especificado.

Uma especificação index_col_name pode finalizar com ASC ou DESC. Esta palavras chaves são permitidas para estensão futura para especificar o armazenamento do valor do índice em crescente ou decrescente. Atualmente elas são analisadas mas ignoradas; valores de índice são sempre armazenados em ordem crescente.

Para mais detalhes sobre como o MySQL utiliza índices, veja Seção 5.4.3, “Como o MySQL Utiliza Índices”.

Indíces FULLTEXT só podem indexar colunas CHAR, VARCHAR e TEXT, e apenas em tabelas MyISAM. Índices FULLTEXT estão disponíveis no MySQL Versão 3.23.23 e posterior. Seção 6.8, “Pesquisa Full-text no MySQL”.

6.5.8. Sintaxe DROP INDEX

DROP INDEX nome_indice ON nome_tabela

DROP INDEX apaga o índice chamado nome_indice da tabela nome_tabela. DROP INDEX não faz nada nem versões do MySQL anteriores a 3.22. Na versão 3.22 ou posterior, DROP INDEX é mapeada em uma instrução ALTER TABLE para apagar o índice. Veja mais informações sobre isto na Seção 6.5.4, “Sintaxe ALTER TABLE.