¿Cómo cambio el tipo de datos para una columna en MySQL?

489

Quiero cambiar el tipo de datos de varias columnas de flotante a int. ¿Cuál es la forma más sencilla de hacer esto?

No hay datos de los que preocuparse, todavía.

Eric Wilson
fuente
66
Solo para hacer esto explícito, las respuestas a continuación (usando ALTER TABLE) funcionarán, de hecho, incluso si la columna ya contiene datos. Sin embargo, la conversión de una columna flotante en una columna entera hará que los valores no enteros se redondeen al entero más cercano.
Ilmari Karonen

Respuestas:

898

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

ALTER TABLE tablename MODIFY columnname INTEGER;

Esto cambiará el tipo de datos de la columna dada

Dependiendo de cuántas columnas desee modificar, sería mejor generar un script o utilizar algún tipo de GUI de cliente mysql

Yannick Motton
fuente
88
Recordatorio amigable: el valor predeterminado para las columnas es NULLABLE, por lo que si tiene una columna NOT NULL, no olvide usar "MODIFY columnname INTEGER NOT NULL" o de lo contrario cambiará su columna de NOT NULL a NULL.
Despertar
3
¿Alterar la tabla eliminará los datos de la tabla o fallará en la ejecución si algo no está relacionado con el nuevo tipo de columna?
EndermanAPM
1
ALTER TABLE tablename MODIFY columnname INTEGER unsigned; <- si le preocupa que la nueva columna no esté firmada. Fue mi caso.
mircealungu
Creo que la advertencia de @Despertars también podría ser relevante para mantener las especificaciones de CHARSET o COLLATE.
Halvor Holsten Strand
44
alter table table_name modify column_name int(5)
php
fuente
37

También puedes usar esto:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2)
Ricardo
fuente
12

Si desea cambiar todas las columnas de un determinado tipo a otro tipo, puede generar consultas utilizando una 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 ejemplo, si desea cambiar las columnas de tinyint(4)a bit(1), ejecútelo así:

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)';

y obtener una salida 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;

!! No mantiene restricciones únicas, pero debe arreglarse fácilmente con otro ifparámetro para concat. Dejaré que el lector implemente eso si es necesario.

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

Ej:

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

Utiliza el alter table ... change ...método, por ejemplo:

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
fuente
Creo que es MODIFICAR en lugar de cambiar, pero tal vez ambos funcionen.
Zsolt Szilagyi
4

Para cambiar el tipo de datos de la columna, hay un método de cambio y un método de modificación

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Para cambiar el nombre del campo también use el método de cambio

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

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

También puede establecer un valor predeterminado para la columna, solo agregue la palabra clave DEFAULT seguida del valor.

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

Esto también funciona para MariaDB (versión probada 10.2)

michael01angelo
fuente
0

Si desea modificar los detalles de la columna, agregue un comentario, use esto

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