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

เพิ่มคอลัมน์ใหม่และ Index พร้อมกันในคำสั่ง ALTER TABLE เดียวใน MySQL

บทนำ

คำสั่ง 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