MySQL cho phép thay đổi vị trí cột dùng ALTER TABLE ... CHANGE COLUMN ... FIRST|AFTER.
Cú pháp
-- Di chuyển cột lên đầu ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type FIRST; -- Di chuyển cột sau cột khác ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type AFTER other_column_name;
Lưu ý: Phải lặp lại tên cột và kiểu dữ liệu (data_type) ngay cả khi không đổi.
Ví dụ minh họa
Bảng ban đầu:
mysql> SHOW CREATE TABLE AddColumn; +-----------+------------------------------------------------------------------+ | Table | Create Table | +-----------+------------------------------------------------------------------+ | AddColumn | CREATE TABLE `addcolumn` (`StudentId` varchar(50), `StudentName` varchar(300)) ... | +-----------+------------------------------------------------------------------+ mysql> DESC AddColumn; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | StudentId | varchar(50) | YES | | NULL | | | StudentName | varchar(300) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+
Di chuyển StudentName lên đầu:
mysql> ALTER TABLE AddColumn CHANGE StudentName StudentName VARCHAR(300) FIRST; Query OK, 0 rows affected (1.28 sec)
Kết quả:
+-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | StudentName | varchar(300) | YES | | NULL | | | StudentId | varchar(50) | YES | | NULL | | +-------------+--------------+------+-----+---------+-------+
Lưu ý quan trọng
- Thao tác này rebuild toàn bộ bảng (table rebuild) → khóa bảng, tốn thời gian với bảng lớn.
- Production: dùng
pt-online-schema-change(Percona) hoặcgh-ost(GitHub) để tránh downtime. - Thứ tự cột chỉ ảnh hưởng
SELECT *,DESC,INSERTkhông chỉ định cột. Không ảnh hưởng hiệu năng truy vấn. - Không thể dùng
BEFORE column_name, chỉ cóFIRSTvàAFTER.