Как изменить тип данных для столбца в MySQL?

489

Я хочу изменить тип данных нескольких столбцов с float на int. Какой самый простой способ сделать это?

Пока нет данных для беспокойства.

Эрик Уилсон
источник
6
Просто чтобы сделать это явным, ответы ниже (используя ALTER TABLE), на самом деле, будут работать, даже если столбец уже содержит данные. Однако преобразование плавающего столбца в целочисленный столбец приведет к тому, что любые нецелые значения в нем будут округлены до ближайшего целого числа.
Ильмари

Ответы:

898

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

ALTER TABLE tablename MODIFY columnname INTEGER;

Это изменит тип данных данного столбца

В зависимости от того, сколько столбцов вы хотите изменить, лучше всего сгенерировать скрипт или использовать какой-нибудь клиентский графический интерфейс mysql.

Янник Моттон
источник
88
Дружеское напоминание - по умолчанию для столбцов используется значение NULLABLE, поэтому, если у вас есть столбец NOT NULL, не забудьте использовать «MODIFY columnname INTEGER NOT NULL», иначе вы измените свой столбец с NOT NULL на NULL.
Despertar
3
Будет ли изменение таблицы удалять данные в таблице или произойдет сбой при выполнении, если что-то не является жалобой с новым типом столбца?
EndermanAPM
1
ALTER TABLE имя таблицы MODIFY имя столбца INTEGER без знака; <- если вы хотите, чтобы новый столбец был без знака. Был мой случай.
Мирцеалунгу
Я думаю, что предупреждение @Despertars также может иметь отношение к сохранению любых спецификаций CHARSET или COLLATE.
Halvor Holsten Strand
37

Вы также можете использовать это:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2)
Ричард
источник
12

Если вы хотите изменить все столбцы определенного типа на другой тип, вы можете сгенерировать запросы, используя такой запрос:

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

Например, если вы хотите изменить столбцы с tinyint(4)на bit(1), запустите их так:

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

и получить вывод, как это:

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;

!! Не сохраняет уникальных ограничений, но должен быть легко исправлен с помощью другого if-параметра concat. Я оставлю это на усмотрение читателя, чтобы реализовать это при необходимости ..

TOBB
источник
7
Alter TABLE `tableName` MODIFY COLUMN `ColumnName` datatype(length);

Пример:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120);
Махрух Мехмуд
источник
5

Вы используете alter table ... change ...метод, например:

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)
Олафур Вааге
источник
Я верю, что это ИЗМЕНИТЬ, а не изменить, но, возможно, оба работают.
Жолт Силаги
4

Для изменения типа данных столбца есть метод изменения и изменить метод

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Для изменения имени поля также используйте метод change

ALTER TABLE student_info CHANGE roll_no identity_no VARCHAR(255);
Хасиб Камаль
источник
1

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

Вы также можете установить значение по умолчанию для столбца, просто добавив ключевое слово DEFAULT, за которым следует значение.

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

Это также работает для MariaDB (протестированная версия 10.2)

michael01angelo
источник
0

Если вы хотите изменить детали столбца добавить комментарий, используйте этот

ALTER TABLE [table_name] MODIFY [column_name] [new data type] DEFAULT [VALUE] COMMENT '[column comment]' 
Joe_Tz
источник