Jak zmienić typ danych dla kolumny w MySQL?

488

Chcę zmienić typ danych wielu kolumn z float na int. Jaki jest najprostszy sposób to zrobić?

Nie ma jeszcze żadnych danych do zmartwienia.

Eric Wilson
źródło
6
Aby wyrazić to jasno, poniższe odpowiedzi (użycie ALTER TABLE) będą w rzeczywistości działać, nawet jeśli kolumna zawiera już dane. Jednak konwersja kolumny swobodnej w kolumnę całkowitą spowoduje zaokrąglenie w niej wartości innych niż całkowite do najbliższej liczby całkowitej.
Ilmari Karonen,

Odpowiedzi:

897

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

ALTER TABLE tablename MODIFY columnname INTEGER;

Spowoduje to zmianę typu danych danej kolumny

W zależności od liczby kolumn, które chcesz zmodyfikować, najlepiej wygenerować skrypt lub użyć GUI klienta mysql

Yannick Motton
źródło
88
Przyjazne przypomnienie - Domyślna wartość dla kolumn to NULLABLE, więc jeśli masz kolumnę NOT NULL, nie zapomnij użyć opcji „MODIFY INTEGER NOT NULL”, w przeciwnym razie zmienisz kolumnę z NOT NULL na NULL.
Despertar,
3
Czy zmiana tabeli usunie dane w tabeli lub zakończy się niepowodzeniem, jeśli coś nie będzie narzekać na nowy typ kolumny?
EndermanAPM
1
ALTER TABLE tablename MODIFY nazwa kolumny INTEGER unsigned; <- jeśli zależy Ci na tym, aby nowa kolumna nie była podpisana. Była moja sprawa.
mircealungu
Myślę, że ostrzeżenie @Despertars może również mieć znaczenie dla zachowania jakichkolwiek specyfikacji CHARSET lub COLLATE.
Halvor Holsten Strand
44
alter table table_name modify column_name int(5)
php
źródło
37

Możesz także użyć tego:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2)
Richard
źródło
12

Jeśli chcesz zmienić wszystkie kolumny określonego typu na inny typ, możesz generować zapytania za pomocą zapytania takiego jak to:

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

Na przykład, jeśli chcesz zmienić kolumny z tinyint(4)na bit(1), uruchom go w następujący sposób:

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

i uzyskaj wynik podobny do tego:

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;

!! Nie utrzymuje unikalnych ograniczeń, ale powinien być łatwo naprawiony za pomocą innego ifparametru do concat. W razie potrzeby pozostawię to czytelnikowi.

Tobb
źródło
7
Alter TABLE `tableName` MODIFY COLUMN `ColumnName` datatype(length);

Np .:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120);
Mahrukh Mehmood
źródło
5

Korzystasz z alter table ... change ...metody, na przykład:

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)
Lalafur Waage
źródło
Wierzę, że to MODYFIKUJE, a nie zmienia, ale może oba działają.
Zsolt Szilagyi
4

Aby zmienić typ danych kolumny, należy zmienić metodę i zmodyfikować metodę

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Aby zmienić nazwę pola, użyj również metody zmiany

ALTER TABLE student_info CHANGE roll_no identity_no VARCHAR(255);
Hasib Kamal
źródło
1

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

Możesz także ustawić wartość domyślną dla kolumny, po prostu dodaj słowo kluczowe DEFAULT, a następnie wartość.

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

Działa to również w przypadku MariaDB (testowana wersja 10.2)

michael01angelo
źródło
0

Jeśli chcesz zmienić szczegóły kolumny, dodaj komentarz, użyj tego

ALTER TABLE [table_name] MODIFY [column_name] [new data type] DEFAULT [VALUE] COMMENT '[column comment]' 
Joe_Tz
źródło