บทนำ
คำสั่ง ALTER TABLE ใน MySQL รองรับการทำหลาย Operation พร้อมกันในคำสั่งเดียว โดยคั่นด้วยคอมมา (,) รวมถึง ADD COLUMN และ ADD INDEX
ตัวอย่างการสร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT,
-> Name VARCHAR(100),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.69 sec)
ตรวจสอบโครงสร้างก่อน ALTER
mysql> DESC DemoTable;
ผลลัพธ์
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
คำสั่ง ALTER: เพิ่มคอลัมน์ ArrivalDate และ Index พร้อมกัน
mysql> ALTER TABLE DemoTable
-> ADD ArrivalDate DATETIME DEFAULT CURRENT_TIMESTAMP,
-> ADD INDEX(ArrivalDate);
Query OK, 0 rows affected (2.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
ตรวจสอบโครงสร้างหลัง ALTER
mysql> DESC DemoTable;
ผลลัพธ์
+-------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(100) | YES | | NULL | |
| ArrivalDate | datetime | YES | MUL | CURRENT_TIMESTAMP | |
+-------------+--------------+------+-----+-------------------+----------------+
3 rows in set (0.01 sec)
คำอธิบาย
ADD ArrivalDate DATETIME DEFAULT CURRENT_TIMESTAMP- เพิ่มคอลัมน์ใหม่พร้อมค่า Default เป็นเวลาปัจจุบันADD INDEX(ArrivalDate)- สร้าง Index บนคอลัมน์ใหม่นี้ (Key = MUL)- ทำใน Transaction เดียว (Atomic) - หากล้มเหลวจะ Rollback ทั้งหมด
Operation อื่นที่ทำได้พร้อมกันใน ALTER TABLE
ALTER TABLE DemoTable
ADD COLUMN NewCol INT,
DROP COLUMN OldCol,
MODIFY COLUMN Name VARCHAR(200),
CHANGE COLUMN OldName NewName VARCHAR(100),
ADD INDEX idx_name (Name),
DROP INDEX idx_old,
ADD PRIMARY KEY (Id),
ADD FOREIGN KEY (UserId) REFERENCES Users(Id),
RENAME TO NewTableName;
ข้อควรระวัง
- ALTER TABLE บนตารางใหญ่อาจใช้เวลานานและ Lock ตาราง (ใช้ ALGORITHM=INPLACE, LOCK=NONE ใน MySQL 5.6+)
- การเพิ่ม Index ใหม่ต้องสแกนข้อมูลทั้งตาราง
- ควรทดสอบใน Staging ก่อน Production