XOOPS Brasil

 

A.7. Assuntos Relacionados a Definições de Tabelas

A.7.1. Problemas com ALTER TABLE.

ALTER TABLE altera uma tablea para o conjunto de caracteres atual. Se você obter um erro de chave duplicada durante ALTER TABLE, então a causa é que o novo conjunto de caracteres mapeia duas chaves para o mesmo valor ou que a tabela está corrompida, caso no qual você deve fazer um REPAIR TABLE na tabela.

Se ALTER TABLE finalizar com um erro com este:

Error on rename of './database/name.frm' to './database/B-a.frm' (Errcode: 17)

o problema pode ser que o MySQL falhou em um ALTER TABLE anterior e existe uma tabela antiga chamada A-algumacoisa ou B-algumacoisa. Neste caso, vá até o diretório de dados do MySQL e delete todos os campos que tenham nomes iniciando com A- ou B-. (Você pode quere movê-los para algum lugar em vez de deletá-los.)

ALTER TABLE funciona do seguinte modo:

  • Cria uma nova tabela chamada A-xxx com as alterações pedidas.

  • Todos os registros da tabela antiga são copiadas para A-xxx.

  • A tabela antiga é renomeada com B-xxx.

  • A-xxx é renomeada com o nome da sua tabela antiga.

  • B-xxx é deletada.

Se algo der errado com a operação de renomeação, o MySQL tenta desfazer a mudança. Se algo der seriamente errado (isto não deve acontecer, é claro), o MySQL pode deixar a tabela antiga como B-xxx, mas uma simples renomeação no nível do sistema deve trazer o seus dados de volta.

A.7.2. Como Alterar a Ordem das Colunas em Uma Tabela

O ponto principal do MySQL é abstrair a aplicação do formato de armazenamento dos dados. Você sempre deve especificar a ordem na qual você deseja recuperar os dados. Por exemplo:

SELECT nome_coluna1, nome_coluna2, nome_coluna3 FROM nome_tabela;

retornará na ordem nome_coluna1, nome_coluna2, nome_coluna3, enquanto:

SELECT nome_coluna1, nome_coluna3, nome_coluna2 FROM nome_tabela;

retornará colunas na ordem nome_coluna1, nome_coluna3, nome_coluna2.

Se você quiser alterar a ordem das colunas, você pode fazer o seguinte:

  1. Crie uma nova abela com as colunas na ordem correta.

  2. Execute INSERT INTO tabela_nova SELECT campos-na-ordem-de-tabela_nova FROM tabela_antiga.

  3. Delete ou renomeie tabela_antiga.

  4. ALTER TABLE tabela_nova RENAME tabela_antiga.

Em uma aplicação, você nunca deve usar SELECT * e recuperar as colunas baseado em suas posições, pois a ordem e a posição nas quais as colunas são retornadas não permanecerá a mesma se você adicionar/mover/deletar colunas. Uma simples alteração na estrutura de seu banco de dados causaria uma falha em sua aplicação. É claro que SELECT * é muito mais cabível em testes de cosultas.

A.7.3. Problemas com TEMPORARY TABLE

Segue uma lista de limitações com TEMPORARY TABLES.

  • Uma tabela temporária só pode ser do tipo HEAP, ISAM, MyISAM, MERGE, ou InnoDB.

  • Você não pode usar tabelas temporárias mais que uma vez na mesma consulta. Por exemplo, o seguinte não funciona.

    mysql> SELECT * FROM tabela_temporária, tabela_temporária AS t2;
    
  • Você não pode usar RENAME em uma tabela temporária (TEMPORARY). Note que ALTER TABLE nome_orig RENAME nome_novo funciona!