Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách thay đổi kiểu dữ liệu cột bảng MySQL?

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 KEY trướ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;