Thời gian đọc: 11 phút
Câu lệnh ALTER TABLE
trong MySQL được sử dụng để thay đổi cấu trúc của một bảng hiện có mà không cần xóa và tạo lại bảng. Các thay đổi có thể bao gồm thêm cột mới, thay đổi kiểu dữ liệu, thêm hoặc xóa các ràng buộc, và nhiều hơn nữa. Hướng dẫn này sẽ bao gồm từ cơ bản đến nâng cao với các minh họa chi tiết về câu lệnh ALTER TABLE
.
ALTER TABLE table_name
ADD COLUMN column_name data_type;
Giả sử có bảng employees
:
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
);
Bây giờ bạn muốn thêm cột email
vào bảng employees
:
ALTER TABLE employees
ADD COLUMN email VARCHAR(255);
ALTER TABLE table_name
ADD COLUMN column1 data_type,
ADD COLUMN column2 data_type;
Thêm cột address
và phone_number
vào bảng employees
:
ALTER TABLE employees
ADD COLUMN address VARCHAR(255),
ADD COLUMN phone_number VARCHAR(15);
ALTER TABLE table_name
DROP COLUMN column_name;
Xóa cột address
khỏi bảng employees
:
ALTER TABLE employees
DROP COLUMN address;
ALTER TABLE table_name
CHANGE COLUMN old_name new_name data_type;
Đổi tên cột phone_number
thành contact_number
:
ALTER TABLE employees
CHANGE COLUMN phone_number contact_number VARCHAR(20);
ALTER TABLE table_name
MODIFY COLUMN column_name new_data_type;
Thay đổi kiểu dữ liệu của cột contact_number
từ VARCHAR(20)
thành INT
:
ALTER TABLE employees
MODIFY COLUMN contact_number INT;
ALTER TABLE old_table_name
RENAME TO new_table_name;
Đổi tên bảng employees
thành staff
:
ALTER TABLE employees
RENAME TO staff;
FOREIGN KEY
ALTER TABLE table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES other_table (other_column);
Giả sử có bảng departments
:
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100)
);
Thêm khóa ngoại department_id
vào bảng employees
, tham chiếu đến bảng departments
:
ALTER TABLE employees
ADD CONSTRAINT fk_department
FOREIGN KEY (department_id)
REFERENCES departments(department_id);
FOREIGN KEY
ALTER TABLE table_name
DROP FOREIGN KEY fk_name;
Xóa ràng buộc khóa ngoại fk_department
khỏi bảng employees
:
ALTER TABLE employees
DROP FOREIGN KEY fk_department;
INDEX
cho một cộtALTER TABLE table_name
ADD INDEX index_name (column_name);
Thêm chỉ mục (INDEX
) cho cột email
để cải thiện tốc độ truy vấn:
ALTER TABLE employees
ADD INDEX idx_email (email);
INDEX
ALTER TABLE table_name
DROP INDEX index_name;
Xóa chỉ mục idx_email
khỏi bảng employees
:
ALTER TABLE employees
DROP INDEX idx_email;
UNIQUE INDEX
ALTER TABLE table_name
ADD UNIQUE (column_name);
Đảm bảo rằng giá trị của cột email
là duy nhất:
ALTER TABLE employees
ADD UNIQUE (email);
PRIMARY KEY
PRIMARY KEY
:ALTER TABLE table_name
ADD PRIMARY KEY (column_name);
PRIMARY KEY
:ALTER TABLE table_name
DROP PRIMARY KEY;
PRIMARY KEY
cho cột id
:ALTER TABLE employees
ADD PRIMARY KEY (id);
PRIMARY KEY
:ALTER TABLE employees
DROP PRIMARY KEY;
DEFAULT
)ALTER TABLE table_name
ADD COLUMN column_name data_type DEFAULT default_value;
Thêm cột status
với giá trị mặc định là 'active'
:
ALTER TABLE employees
ADD COLUMN status VARCHAR(20) DEFAULT 'active';
ALTER TABLE table_name
ALTER COLUMN column_name SET DEFAULT default_value;
Thay đổi giá trị mặc định của cột status
thành 'inactive'
:
ALTER TABLE employees
ALTER COLUMN status SET DEFAULT 'inactive';
ALTER TABLE table_name
ALTER COLUMN column_name DROP DEFAULT;
Xóa giá trị mặc định của cột status
:
ALTER TABLE employees
ALTER COLUMN status DROP DEFAULT;
VIRTUAL
)Cột ảo trong MySQL là cột mà giá trị của nó được tính toán từ các cột khác trong bảng.
ALTER TABLE table_name
ADD COLUMN virtual_column AS (expression) VIRTUAL;
Thêm cột full_name
là kết quả ghép giữa cột first_name
và last_name
:
ALTER TABLE employees
ADD COLUMN full_name VARCHAR(255) AS (CONCAT(first_name, ' ', last_name)) VIRTUAL;
ALTER TABLE table_name
DROP COLUMN virtual_column;
JSON
ALTER TABLE table_name
ADD COLUMN column_name JSON;
Thêm cột extra_data
kiểu dữ liệu JSON
để lưu trữ các thông tin bổ sung:
ALTER TABLE employees
ADD COLUMN extra_data JSON;
ENGINE
của bảngALTER TABLE table_name ENGINE = engine_type;
Thay đổi loại ENGINE
của bảng từ InnoDB
sang MyISAM
:
ALTER TABLE employees ENGINE = MyISAM;
PARTITIONING
)Phân vùng bảng có thể giúp quản lý dữ liệu lớn hiệu quả hơn. Bạn có thể thêm, xóa, hoặc thay đổi phân vùng bảng với câu lệnh ALTER TABLE
.
ALTER TABLE employees
PARTITION BY RANGE (YEAR(hire_date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
ALTER TABLE employees
REMOVE PARTITIONING;
Đây là câu lệnh nâng cao để xóa bảng chỉ khi bảng đó tồn tại, giúp tránh lỗi nếu bảng đã bị xóa trước đó:
DROP TABLE IF EXISTS table_name;
DROP TABLE IF EXISTS employees;
Những ví dụ trên bao gồm hầu hết các thao tác với ALTER TABLE
từ cơ bản đến nâng cao, giúp bạn quản lý cấu trúc bảng MySQL một cách hiệu quả trong các tình huống khác nhau.
Dưới đây là các ví dụ nâng cao khác về câu lệnh ALTER TABLE
trong MySQL, giúp bạn hiểu rõ hơn về những tính năng mạnh mẽ và phức tạp của nó.
AUTO_INCREMENT
)Trong một số tình huống, bạn có thể muốn chuyển một cột hiện tại thành cột tự động tăng giá trị (AUTO_INCREMENT
). Điều này rất hữu ích khi bạn muốn cột ID tự động tăng mà không cần thay đổi cấu trúc bảng hiện tại.
ALTER TABLE table_name
MODIFY COLUMN column_name data_type AUTO_INCREMENT;
Giả sử cột id
trong bảng employees
hiện không phải là AUTO_INCREMENT
. Bây giờ, bạn muốn thay đổi nó thành tự động tăng:
ALTER TABLE employees
MODIFY COLUMN id INT AUTO_INCREMENT;
CHECK
CHECK
là một loại ràng buộc cho phép bạn đặt điều kiện cho dữ liệu được phép nhập vào một cột cụ thể.
CHECK
:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (condition);
Thêm một ràng buộc CHECK
để đảm bảo rằng tuổi của nhân viên phải lớn hơn 18:
ALTER TABLE employees
ADD CONSTRAINT chk_age CHECK (age > 18);
CHECK
:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
Ví dụ:
ALTER TABLE employees
DROP CONSTRAINT chk_age;
FOREIGN KEY
)Trong một số trường hợp, bạn có thể muốn xóa tất cả các khóa ngoại khỏi bảng, ví dụ như khi bạn cần xóa bảng hoặc thực hiện một quá trình migration mà không bị khóa ngoại ngăn chặn.
Để xóa tất cả các ràng buộc khóa ngoại, bạn cần phải xác định các khóa ngoại hiện có trong bảng và sau đó xóa chúng:
ALTER TABLE employees
DROP FOREIGN KEY fk_department;
MySQL cho phép bạn thay đổi vị trí của các cột trong bảng, điều này có thể hữu ích trong việc sắp xếp lại cấu trúc bảng cho dễ đọc hơn.
ALTER TABLE table_name
MODIFY COLUMN column_name data_type AFTER another_column;
Giả sử bạn muốn di chuyển cột email
sau cột name
trong bảng employees
:
ALTER TABLE employees
MODIFY COLUMN email VARCHAR(255) AFTER name;
Nếu bạn muốn di chuyển cột email
lên đầu bảng, bạn có thể sử dụng từ khóa FIRST
:
ALTER TABLE employees
MODIFY COLUMN email VARCHAR(255) FIRST;
Phân vùng theo HASH
thường được sử dụng để phân tán dữ liệu đều qua các phân vùng. Điều này rất hữu ích khi làm việc với các bảng có lượng dữ liệu lớn, giúp tối ưu hiệu suất truy vấn.
ALTER TABLE table_name
PARTITION BY HASH (expression) PARTITIONS number;
Phân vùng bảng employees
theo id
thành 4 phân vùng:
ALTER TABLE employees
PARTITION BY HASH(id) PARTITIONS 4;
Phân vùng theo LIST
giúp phân chia bảng dựa trên danh sách các giá trị cụ thể. Ví dụ, bạn có thể phân vùng theo quốc gia hoặc khu vực địa lý.
ALTER TABLE table_name
PARTITION BY LIST (column_name) (
PARTITION p0 VALUES IN (value1, value2),
PARTITION p1 VALUES IN (value3, value4)
);
Phân vùng bảng employees
dựa trên giá trị của cột country
:
ALTER TABLE employees
PARTITION BY LIST (country) (
PARTITION p1 VALUES IN ('USA', 'Canada'),
PARTITION p2 VALUES IN ('UK', 'Australia'),
PARTITION p3 VALUES IN ('India', 'China')
);
ROW_FORMAT
) cho bảngMySQL cung cấp các kiểu nén khác nhau cho các bảng, giúp tối ưu hóa việc sử dụng dung lượng lưu trữ và hiệu suất truy vấn. Bạn có thể sử dụng ALTER TABLE
để thay đổi định dạng lưu trữ của bảng.
ALTER TABLE table_name
ROW_FORMAT = row_format_type;
Chuyển bảng employees
sang sử dụng định dạng lưu trữ COMPRESSED
để tiết kiệm dung lượng:
ALTER TABLE employees
ROW_FORMAT = COMPRESSED;
UNIQUE
cho nhiều cộtBạn có thể tạo một ràng buộc UNIQUE
trên nhiều cột để đảm bảo rằng sự kết hợp của các giá trị trong các cột này là duy nhất.
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2);
Thêm ràng buộc UNIQUE
cho cột email
và department_id
trong bảng employees
:
ALTER TABLE employees
ADD CONSTRAINT unique_email_department UNIQUE (email, department_id);
ON DELETE CASCADE
Khi bạn thêm một khóa ngoại, bạn có thể chỉ định hành vi khi dữ liệu liên quan bị xóa. Tùy chọn ON DELETE CASCADE
sẽ tự động xóa các bản ghi liên quan khi một bản ghi trong bảng chính bị xóa.
ALTER TABLE table_name
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES other_table (other_column)
ON DELETE CASCADE;
Thêm khóa ngoại department_id
vào bảng employees
, với hành vi ON DELETE CASCADE
:
ALTER TABLE employees
ADD CONSTRAINT fk_department
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE CASCADE;
TABLESPACE
)Bạn có thể thay đổi TABLESPACE
để lưu trữ dữ liệu bảng trên các ổ đĩa hoặc hệ thống khác nhau, tùy thuộc vào nhu cầu của hệ thống.
ALTER TABLE table_name
TABLESPACE tablespace_name STORAGE DISK;
Chuyển bảng employees
sang sử dụng TABLESPACE
khác:
ALTER TABLE employees
TABLESPACE my_tablespace STORAGE DISK;
Những ví dụ nâng cao này giúp bạn nắm vững các tính năng mạnh mẽ của câu lệnh ALTER TABLE
trong MySQL. Khi quản lý các bảng lớn và phức tạp, bạn có thể tận dụng các tính năng này để tối ưu hóa hiệu suất và quản lý dữ liệu một cách hiệu quả hơn.