ฉันจะเปลี่ยนประเภทข้อมูลสำหรับคอลัมน์ใน MySQL ได้อย่างไร


488

ฉันต้องการเปลี่ยนชนิดข้อมูลของหลายคอลัมน์จาก float เป็น int วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?

ยังไม่มีข้อมูลที่ต้องกังวล


6
เพียงเพื่อให้ชัดเจนคำตอบด้านล่าง (โดยใช้ALTER TABLE) จะใช้งานได้จริงแม้ว่าคอลัมน์จะมีข้อมูลอยู่แล้ว อย่างไรก็ตามการแปลงคอลัมน์ลอยเป็นคอลัมน์จำนวนเต็มจะทำให้ค่าที่ไม่ใช่จำนวนเต็มใด ๆ ในนั้นถูกปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด
Ilmari Karonen

คำตอบ:


897

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

ALTER TABLE tablename MODIFY columnname INTEGER;

สิ่งนี้จะเปลี่ยนประเภทข้อมูลของคอลัมน์ที่กำหนด

ขึ้นอยู่กับคอลัมน์ที่คุณต้องการแก้ไขมันอาจจะดีที่สุดในการสร้างสคริปต์หรือใช้ GUI ไคลเอนต์ mysql บางประเภท


88
การแจ้งเตือนที่เป็นมิตร - ค่าเริ่มต้นสำหรับคอลัมน์คือ NULLABLE ดังนั้นหากคุณมีคอลัมน์ที่ไม่ใช่ค่า NULL อย่าลืมใช้ "แก้ไขคอลัมน์ชื่อ INTEGER NOT NULL" ไม่เช่นนั้นคุณจะเปลี่ยนคอลัมน์ของคุณจากค่า NULL เป็น NULL
Despertar

3
จะแก้ไขตารางที่ลบข้อมูลในตารางหรือไม่สามารถดำเนินการได้หากมีบางสิ่งที่ไม่ร้องเรียนกับประเภทคอลัมน์ใหม่
EndermanAPM

1
แก้ไขตาราง tablename แก้ไขคอลัมน์ชื่อ INTEGER ไม่ได้ลงนาม; <- หากคุณสนใจคอลัมน์ใหม่ที่ไม่ได้ลงชื่อ เป็นกรณีของฉัน
mircealungu

ฉันคิดว่าคำเตือน @Despertars อาจเกี่ยวข้องกับการเก็บข้อมูลจำเพาะของ CHARSET หรือ COLLATE
Halvor Holsten Strand



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-parameter concatไป ฉันจะปล่อยให้ผู้อ่านนำไปใช้หากจำเป็น ..



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)

ฉันเชื่อว่ามันดัดแปลงมากกว่าการเปลี่ยนแปลง แต่อาจใช้ได้ทั้งคู่
Zsolt Szilagyi

4

ในการเปลี่ยนประเภทข้อมูลคอลัมน์มี วิธีการเปลี่ยนและแก้ไขวิธี

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

หากต้องการเปลี่ยนชื่อฟิลด์ให้ใช้วิธีการเปลี่ยนด้วย

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)


0

หากคุณต้องการแก้ไขรายละเอียดคอลัมน์เพิ่มความคิดเห็นใช้สิ่งนี้

ALTER TABLE [table_name] MODIFY [column_name] [new data type] DEFAULT [VALUE] COMMENT '[column comment]' 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.