Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เปลี่ยน Data Type คอลัมน์ใน MySQL ด้วย ALTER TABLE MODIFY

เมื่อต้องการเปลี่ยนชนิดข้อมูล (Data Type) ของคอลัมน์ที่มีอยู่แล้ว ให้ใช้คำสั่ง ALTER TABLE ... MODIFY ซึ่งจะรักษาข้อมูลเดิมไว้ (ถ้าเข้ากันได้)

สร้างตารางและตรวจสอบโครงสร้าง

mysql> create table DemoTable (
    StudentId varchar(200) not null,
    StudentName varchar(20),
    StudentAge int,
    StudentAddress varchar(20),
    StudentCountryName varchar(20)
);
mysql> desc DemoTable;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| StudentId          | varchar(200) | NO   |     | NULL    |       |
| StudentName        | varchar(20)  | YES  |     | NULL    |       |
| StudentAge         | int(11)      | YES  |     | NULL    |       |
| StudentAddress     | varchar(20)  | YES  |     | NULL    |       |
| StudentCountryName | varchar(20)  | YES  |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+

เปลี่ยน StudentId จาก VARCHAR(200) เป็น BIGINT UNSIGNED

mysql> alter table DemoTable 
modify StudentId BIGINT(10) UNSIGNED NOT NULL DEFAULT 0;

ตรวจสอบหลังเปลี่ยน

mysql> desc DemoTable;
+--------------------+---------------------+------+-----+---------+-------+
| Field              | Type                | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------+-------+
| StudentId          | bigint(10) unsigned | NO   |     | 0       |       |
| StudentName        | varchar(20)         | YES  |     | NULL    |       |
| StudentAge         | int(11)             | YES  |     | NULL    |       |
| StudentAddress     | varchar(20)         | YES  |     | NULL    |       |
| StudentCountryName | varchar(20)         | YES  |     | NULL    |       |
+--------------------+---------------------+------+-----+---------+-------+

รูปแบบคำสั่ง MODIFY

ALTER TABLE table_name MODIFY column_name new_data_type [constraints];

ข้อจำกัดและคำเตือนสำคัญ

  • Data Loss - การแปลง VARCHAR→INT จะลบข้อมูลที่ไม่ใช่ตัวเลข
  • Truncation - VARCHAR(10) → VARCHAR(5) ตัดข้อมูลทิ้ง
  • NULL → NOT NULL - ต้องไม่มีค่า NULL อยู่ในคอลัมน์
  • Foreign Key - ต้อง Drop FK ก่อน แล้วสร้างใหม่หลัง MODIFY
  • Auto Increment - ไม่สามารถ MODIFY คอลัมน์ AI ได้โดยตรง

ตัวแปลงชนิดข้อมูลที่ปลอดภัย (Safe Conversions)

จากไปปลอดภัย?
VARCHARTEXT✅ ใช่
INTBIGINT✅ ใช่
DECIMAL(10,2)DECIMAL(12,4)✅ ใช่
DATETIMETIMESTAMP⚠️ ต้องเช็ค Timezone
VARCHARINT❌ เฉพาะตัวเลขเท่านั้น

Best Practice

  1. Backup ตารางก่อน: CREATE TABLE backup LIKE original; INSERT INTO backup SELECT * FROM original;
  2. ทดสอบใน Staging ก่อน
  3. ใช้ CHECK TABLE หลัง MODIFY
  4. ระวัง Application ที่อาจส่งค่าเก่า