Como altero o tipo de dados para uma coluna no MySQL?

489

Quero alterar o tipo de dados de várias colunas de float para int. Qual é a maneira mais simples de fazer isso?

Ainda não há dados para se preocupar.

Eric Wilson
fonte
6
Apenas para tornar isso explícito, as respostas abaixo (usando ALTER TABLE) funcionarão mesmo se a coluna já contiver dados. No entanto, converter uma coluna flutuante em uma coluna inteira fará com que quaisquer valores não inteiros nela sejam arredondados para o número inteiro mais próximo.
Ilmari Karonen

Respostas:

898

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

ALTER TABLE tablename MODIFY columnname INTEGER;

Isso mudará o tipo de dados da coluna especificada

Dependendo de quantas colunas você deseja modificar, pode ser melhor gerar um script ou usar algum tipo de GUI do cliente mysql

Yannick Motton
fonte
88
Lembrete amigável - O padrão para colunas é NULLABLE; portanto, se você tiver uma coluna NOT NULL, não se esqueça de usar "MODIFY columnname INTEGER NOT NULL" ou então você alterará sua coluna de NOT NULL para NULL.
Despertar
3
Alter table excluirá os dados da tabela ou falhará na execução se algo não for uma reclamação com o novo tipo de coluna?
precisa saber é o seguinte
1
ALTER TABLE nome da tabela MODIFY columnname INTEGER não assinado; <- se você se importa com a nova coluna não assinada. Foi o meu caso.
55568 Mircealungu #
Acho que o aviso @Despertars também pode ser relevante para manter as especificações de CHARSET ou COLLATE.
Halvor Holsten Strand
44
alter table table_name modify column_name int(5)
php
fonte
37

Você também pode usar isso:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2)
Richard
fonte
12

Se você deseja alterar todas as colunas de um determinado tipo para outro, pode gerar consultas usando uma consulta como esta:

select distinct concat('alter table ',
                       table_name,
                       ' modify ',
                       column_name,
                       ' <new datatype> ',
                       if(is_nullable = 'NO', ' NOT ', ''),
                       ' NULL;')
  from information_schema.columns
  where table_schema = '<your database>' 
    and column_type = '<old datatype>';

Por exemplo, se você deseja alterar as colunas de tinyint(4)para bit(1), execute-o assim:

select distinct concat('alter table ',
                       table_name,
                       ' modify ',
                       column_name,
                       ' bit(1) ',
                       if(is_nullable = 'NO', ' NOT ', ''),
                       ' NULL;')
  from information_schema.columns
  where table_schema = 'MyDatabase' 
    and column_type = 'tinyint(4)';

e obtenha uma saída como esta:

alter table table1 modify finished bit(1)  NOT  NULL;
alter table table2 modify canItBeTrue bit(1)  NOT  NULL;
alter table table3 modify canBeNull bit(1)  NULL;

!! Não mantém restrições exclusivas, mas deve ser facilmente corrigido com outro ifparâmetro para concat. Vou deixar para o leitor implementar isso, se necessário ..

Tobb
fonte
7
Alter TABLE `tableName` MODIFY COLUMN `ColumnName` datatype(length);

Ex:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120);
Mahrukh Mehmood
fonte
5

Você usa o alter table ... change ...método, por exemplo:

mysql> create table yar (id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into yar values(5);
Query OK, 1 row affected (0.01 sec)

mysql> alter table yar change id id varchar(255);
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc yar;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)
Ólafur Waage
fonte
Eu acredito que é MODIFICAR ao invés de mudar, mas talvez ambos funcionem.
Zsolt Szilagyi
4

Para alterar o tipo de dados da coluna, existem métodos de alteração e método de modificação

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Para alterar o nome do campo, use também o método change

ALTER TABLE student_info CHANGE roll_no identity_no VARCHAR(255);
Hasib Kamal
fonte
1

https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

Você também pode definir um valor padrão para a coluna, basta adicionar a palavra-chave DEFAULT seguida pelo valor.

ALTER TABLE [table_name] MODIFY [column_name] [NEW DATA TYPE] DEFAULT [VALUE];

Isso também está funcionando para MariaDB (versão testada 10.2)

michael01angelo
fonte
0

Se você deseja alterar os detalhes da coluna, adicione um comentário, use este

ALTER TABLE [table_name] MODIFY [column_name] [new data type] DEFAULT [VALUE] COMMENT '[column comment]' 
Joe_Tz
fonte