เมื่อต้องการเปลี่ยนชนิดข้อมูล (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)
| จาก | ไป | ปลอดภัย? |
|---|---|---|
| VARCHAR | TEXT | ✅ ใช่ |
| INT | BIGINT | ✅ ใช่ |
| DECIMAL(10,2) | DECIMAL(12,4) | ✅ ใช่ |
| DATETIME | TIMESTAMP | ⚠️ ต้องเช็ค Timezone |
| VARCHAR | INT | ❌ เฉพาะตัวเลขเท่านั้น |
Best Practice
- Backup ตารางก่อน:
CREATE TABLE backup LIKE original; INSERT INTO backup SELECT * FROM original; - ทดสอบใน Staging ก่อน
- ใช้
CHECK TABLEหลัง MODIFY - ระวัง Application ที่อาจส่งค่าเก่า