2009-08-31 69 views
312

Tôi muốn thay đổi kiểu dữ liệu của nhiều cột từ phao sang int. Cách đơn giản nhất để làm điều này là gì?Làm cách nào để thay đổi kiểu dữ liệu cho một cột trong MySQL?

Không có dữ liệu nào phải lo lắng.

+3

Chỉ cần để làm cho rõ ràng, câu trả lời dưới đây (sử dụng 'ALTER TABLE') sẽ , trên thực tế, hoạt động ngay cả khi cột đã chứa dữ liệu. Tuy nhiên, việc chuyển đổi một cột float thành một cột số nguyên sẽ gây ra bất kỳ giá trị không nguyên nào trong nó được làm tròn đến số nguyên gần nhất. –

Trả lời

620

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

ALTER TABLE tablename MODIFY columnname INTEGER; 

này sẽ thay đổi kiểu dữ liệu của cột trao

Tùy thuộc vào howmany cột mà bạn muốn chỉnh sửa nó có thể là tốt nhất để tạo ra một kịch bản, hoặc sử dụng một số loại mysql client GUI

+38

Lời nhắc thân thiện - Mặc định cho cột là NULLABLE, vì vậy nếu bạn có cột NOT NULL, đừng quên sử dụng "MODIFY columnname INTEGER NOT NULL" nếu không bạn sẽ thay đổi cột từ NOT NULL thành NULL. – Despertar

+0

Sẽ thay đổi bảng xóa dữ liệu trên bảng hoặc không thực hiện được nếu có điều gì đó không có khiếu nại với loại cột mới? – EndermanAPM

+1

ALTER TABLE tablename MODIFY columnname INTEGER unsigned; <- nếu bạn quan tâm đến cột mới chưa được ký. Là trường hợp của tôi. – mircealungu

5

Bạn sử dụng phương thức alter table ... change ..., ví dụ:

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

Bạn cũng có thể sử dụng này:

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

Nếu bạn muốn thay đổi tất cả các cột của một loại nhất định để loại khác, bạn có thể tạo ra các truy vấn sử dụng một truy vấn như thế này:

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

Ví dụ: nếu bạn muốn thay đổi cột từ tinyint(4) thành bit(1), hãy chạy như sau:

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

và nhận được kết quả như sau:

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; 

!! Không giữ các ràng buộc duy nhất, nhưng phải dễ dàng được sửa với một thông số if khác thành concat. Tôi sẽ để lại nó lên đến người đọc để thực hiện điều đó nếu cần thiết ..

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

Ex:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120); 
Các vấn đề liên quan