Sử dụng ALTER TABLE ... MODIFY COLUMN để thay đổi kiểu dữ liệu của cột hiện có.
Tạo bảng ban đầu
mysql> CREATE TABLE DemoTable (
-> StudentId VARCHAR(200) NOT NULL,
-> StudentName VARCHAR(20),
-> StudentAge INT,
-> StudentAddress VARCHAR(20),
-> StudentCountryName VARCHAR(20)
-> );
Kiểm tra cấu trúc ban đầu
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 | | +--------------------+--------------+------+-----+---------+-------+
Thay đổi StudentId từ VARCHAR(200) sang BIGINT UNSIGNED
mysql> ALTER TABLE DemoTable
-> MODIFY StudentId BIGINT(10) UNSIGNED NOT NULL DEFAULT 0;
Query OK, 0 rows affected (1.51 sec)
Kiểm tra cấu trúc sau thay đổi
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 | | +--------------------+---------------------+------+-----+---------+-------+
Lưu ý quan trọng khi thay đổi kiểu dữ liệu
- Mất dữ liệu: Nếu dữ liệu hiện tại không chuyển đổi được (ví dụ: 'abc' sang INT), MySQL sẽ cắt bớt hoặc báo lỗi tùy mode
- Strict SQL Mode: Khuyên bật
STRICT_TRANS_TABLESđể báo lỗi thay vì im lặng cắt dữ liệu - Index/Foreign Key: Cần xóa index/FK liên quan trước khi ALTER, sau đó tạo lại
- Khóa chính: Ví dụ trên StudentId không phải PK, nếu là PK cần
DROP PRIMARY KEYtrước - Sao lưu: Luôn backup trước khi ALTER TABLE trên production
Cú pháp thay đổi nhiều cột cùng lúc
ALTER TABLE DemoTable
MODIFY StudentId BIGINT UNSIGNED NOT NULL,
MODIFY StudentAge SMALLINT UNSIGNED,
MODIFY StudentName VARCHAR(50) NOT NULL;