2009-08-31 14 views
312

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

Nie ma jeszcze żadnych danych, o które trzeba się martwić.

+3

Właśnie zrobić to jednoznaczne, odpowiedzi poniżej (przy użyciu 'ALTER TABLE') będzie w rzeczywistości działa, nawet jeśli kolumna zawiera już dane. Jednak konwersja kolumny zmiennoprzecinkowej na kolumnę całkowitą spowoduje, że wszelkie niecałkowite wartości w niej zostaną zaokrąglone do najbliższej liczby całkowitej. –

Odpowiedz

620

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

ALTER TABLE tablename MODIFY columnname INTEGER; 

Będzie to zmienić typ danych danej kolumnie

zależności howmany kolumny chcesz zmodyfikować to może być najlepiej wygenerować skrypt, lub użyć jakiegoś mysql klienta GUI

+38

Przyjazne przypomnienie - domyślne dla kolumn jest NIESTABILNE, więc jeśli masz kolumnę NOT NULL, nie zapomnij użyć "MODIFY columnname INTEGER NOT NULL" lub zmienisz swoją kolumnę z NOT NULL na NULL. – Despertar

+0

Czy zmienisz tabelę, usuwając dane z tabeli lub nie wykonując polecenia, jeśli coś nie jest reklamacją z nowym typem kolumny? – EndermanAPM

+1

ALTER TABLE tablename MODIFY nazwa kolumny INTEGER unsigned; <- jeśli zależy Ci na tym, aby nowa kolumna była niepodpisana. To była moja sprawa. – mircealungu

5

użyć metody alter table ... change ..., 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) 
39
alter table table_name modify column_name int(5) 
29

Można również użyć tego:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2) 
9

Jeśli chcesz zmienić wszystkie kolumny pewnego typu na inny typ, można wygenerować zapytania przy użyciu kwerendy tak:

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 to tak:

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 dane wyjściowe w następujący sposób:

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 zachowuje unikalnych ograniczeń, ale powinien być łatwy do naprawienia innym parametrem if do concat. Zostawię ją do czytnika do wdrożenia, że ​​w razie potrzeby ..

6
Alter TABLE `tableName` MODIFY COLUMN `ColumnName` datatype(length); 

Ex:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120); 
Powiązane problemy