MYSQL – THAY ĐỔI, THẢ, ĐỔI TÊN, SỬA ĐỔI
⚡ Tóm tắt thông minh
ALTER, DROP, RENAME và MODIFY là các chức năng sau: MySQL Các lệnh này định hình lại cơ sở dữ liệu sau khi nó đã được sử dụng. Chúng thêm, xóa, đổi tên và định nghĩa lại các đối tượng như bảng và cột mà không loại bỏ các hàng đã được lưu trữ.

Lệnh ALTER là gì trong... MySQL?
THAY ĐỔI Lệnh này sửa đổi cơ sở dữ liệu, bảng, khung nhìn hoặc các đối tượng cơ sở dữ liệu khác hiện có cần thay đổi trong suốt vòng đời của cơ sở dữ liệu. Đó là lệnh cho phép lược đồ phát triển sau khi nó đã được tạo và điền dữ liệu.
Các yêu cầu kinh doanh hiếm khi đứng yên, và thiết kế cơ sở dữ liệu cũng phải thay đổi theo. Giả sử thiết kế cơ sở dữ liệu cho Myflix đã được triển khai và người dùng đang sử dụng nó, và chỉ đến lúc đó nhóm mới nhận ra rằng thông tin quan trọng đã bị bỏ sót. Không ai muốn mất các hàng dữ liệu hiện có; họ chỉ muốn ghi lại thông tin mới bên cạnh chúng.
Lệnh ALTER xử lý chính xác tình huống đó. Nó có thể thay đổi kiểu dữ liệu của một trường từ chuỗi sang số, đổi tên trường hoặc thêm một cột hoàn toàn mới vào bảng, mà dữ liệu đã được lưu trữ trong bảng vẫn không thay đổi.
Sau khi xác định được mục đích của lệnh, bước tiếp theo là cú pháp để thực hiện lệnh đó.
MySQL Cú pháp ALTER
Cú pháp cơ bản được sử dụng để thêm một cột vào bảng đã tồn tại được hiển thị bên dưới.
ALTER TABLE `table_name` ADD COLUMN `column_name` `data_type`;
tại ĐÂY
- “ALTER BẢNG `tên_bảng`” là lệnh cho biết MySQL máy chủ sửa đổi bảng có tên `table_name`.
- “THÊM CỘT `tên_cột` `loại_dữ liệu`” là lệnh cho biết MySQL Yêu cầu máy chủ thêm một cột mới có tên `column_name` với kiểu dữ liệu `data_type`.
Giả sử Myflix đã triển khai hình thức thanh toán trực tuyến. Để hỗ trợ điều này, cần thêm một trường dành cho số thẻ tín dụng vào bảng thành viên. Trước khi thực hiện bất kỳ sửa đổi nào, nên xem xét cấu trúc hiện tại của bảng. Đoạn mã bên dưới thực hiện điều đó.
SHOW COLUMNS FROM `members`;
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| tên đầy đủ | varchar(350) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
💡 Lưu ý về int(11): Con số trong ngoặc chỉ là chiều rộng hiển thị. MySQL Phiên bản 8.0.17 đã loại bỏ chức năng này đối với các kiểu số nguyên, vì vậy máy chủ hiện đại chỉ báo cáo cột này như sau: intDung lượng lưu trữ không thay đổi.
Đoạn mã bên dưới thêm trường mới vào bảng thành viên.
ALTER TABLE `members` ADD COLUMN `credit_card_number` VARCHAR(25);
Thực thi đoạn mã này trên cơ sở dữ liệu myflixdb sẽ thêm một cột có tên credit_card_number vào bảng members với kiểu dữ liệu VARCHAR. Chạy lại đoạn mã SHOW COLUMNS sẽ cho kết quả như sau.
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| tên đầy đủ | varchar(350) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL | |||
| Số thẻ tín dụng | varchar(25) | CÓ | NULL |
Dòng được đánh dấu xác nhận rằng cột credit_card_number đã được thêm vào bảng members, và dữ liệu đã có trong các cột khác không bị ảnh hưởng bởi việc thêm vào này.
Việc thêm một cột chỉ là một nửa câu chuyện. Một lược đồ cũng phải loại bỏ các đối tượng mà nó không còn cần nữa, đó là nhiệm vụ của lệnh DROP.
Lệnh DROP là gì? MySQL?
Lệnh DROP xóa vĩnh viễn một đối tượng. Nó được sử dụng để
- Xóa cơ sở dữ liệu khỏi MySQL máy chủ.
- Xóa một đối tượng, chẳng hạn như bảng hoặc cột, khỏi cơ sở dữ liệu.
⚠️ Cảnh báo: Lệnh DROP không thể đảo ngược. Cả đối tượng lẫn các hàng bên trong nó đều không thể khôi phục nếu không có bản sao lưu, vì vậy hãy chạy lệnh SELECT trên đối tượng đích và xác nhận bản sao lưu trước.
Rơiping một cột
Trong ví dụ ALTER ở trên, một cột có tên credit_card_number đã được thêm vào bảng members. Giả sử tính năng thanh toán trực tuyến bị hoãn lại và cột đó cần được xóa đi. Đoạn mã sau đây sẽ thực hiện điều đó.
ALTER TABLE `members` DROP COLUMN `credit_card_number`;
Việc thực thi đoạn mã sẽ xóa cột credit_card_number khỏi bảng members. Liệt kê lại các cột sẽ xác nhận kết quả.
SHOW COLUMNS FROM `members`;
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| tên đầy đủ | varchar(350) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
Số thẻ tín dụng đã biến mất khỏi danh sách trường.
DROP BẢNG
Cú pháp để xóa toàn bộ bảng khỏi cơ sở dữ liệu như sau.
DROP TABLE `sample_table`;
Khi áp dụng vào một đối tượng thực tế, phát biểu này sẽ trông như sau.
DROP TABLE `categories_archive`;
Việc thực thi lệnh này sẽ xóa bảng có tên `categories_archive` và tất cả các hàng bên trong bảng đó khỏi cơ sở dữ liệu.
DROP CƠ SỞ DỮ LIỆU
Cùng một từ khóa có thể xóa toàn bộ lược đồ. Việc thêm IF EXISTS sẽ ngăn chặn lỗi đó. MySQL Hàm này sẽ được kích hoạt khi mục tiêu đã biến mất, điều này rất hữu ích bên trong các kịch bản chạy nhiều lần.
DROP DATABASE IF EXISTS `myflixdb_backup`;
Việc xóa một đối tượng là thao tác cuối cùng. Khi bản thân đối tượng cần được giữ lại và chỉ có tên của nó bị sai, lệnh RENAME là công cụ phù hợp.
Lệnh RENAME là gì trong MySQL?
Lệnh RENAME thay đổi tên của một đối tượng cơ sở dữ liệu hiện có, chẳng hạn như bảng hoặc cột, thành một tên mới. Việc đổi tên bảng không làm mất bất kỳ dữ liệu nào có trong bảng đó.
Lệnh này có cú pháp cơ bản như sau.
RENAME TABLE `current_table_name` TO `new_table_name`;
Để đổi tên bảng movierentals thành movie_rentals, đoạn mã bên dưới được sử dụng.
RENAME TABLE `movierentals` TO `movie_rentals`;
Việc thực thi câu lệnh này sẽ đổi tên bảng `movierentals` thành `movie_rentals`. Vì việc đổi tên chỉ thay đổi nhãn, nên câu lệnh tương tự được đảo ngược sẽ khôi phục lại tên ban đầu.
RENAME TABLE `movie_rentals` TO `movierentals`;
Lệnh RENAME TABLE xử lý việc đổi tên bảng. Việc đổi tên một bảng... cộtvà thay đổi nội dung mà nó chứa đựng là nhiệm vụ của từ khóa CHANGE.
Thay đổi từ khóa
Từ khóa CHANGE cho phép bạn
- Đổi tên cột
- Thay đổi kiểu dữ liệu cột
- Thay đổi các ràng buộc cột
Hãy xem xét một ví dụ. Trường full_names trong bảng members có kiểu dữ liệu varchar với độ rộng là 350, như đoạn mã bên dưới xác nhận.
SHOW COLUMNS FROM `members`;
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| tên đầy đủ | varchar(350) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
Giả sử yêu cầu là
- Đổi tên trường từ “full_names” thành “fullname”
- Hãy đổi nó thành kiểu dữ liệu char với độ rộng 250.
- Thêm ràng buộc NOT NULL
Cả ba thao tác chỉnh sửa đều được thực hiện bằng một câu lệnh CHANGE duy nhất.
ALTER TABLE `members` CHANGE COLUMN `full_names` `fullname` char(250) NOT NULL;
Thực thi lệnh này trên myflixdb rồi chạy tiếp script SHOW COLUMNS sẽ cho kết quả như sau.
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| Họ và tên | char (250) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
Cột hiện được gọi là fullname, chứa char(250) và từ chối các giá trị NULL.
Sửa đổi từ khóa
Từ khóa MODIFY cho phép bạn
- Sửa đổi kiểu dữ liệu cột
- Sửa đổi các ràng buộc cột
Trong ví dụ CHANGE ở trên, tên trường phải được cung cấp hai lần, mặc dù việc đổi tên chỉ là một phần của mục tiêu. Việc bỏ sót tên trường trong câu lệnh CHANGE sẽ gây ra lỗi. Khi chỉ cần điều chỉnh kiểu dữ liệu và các ràng buộc, còn tên cột cần giữ nguyên, phương thức MODIFY sẽ thực hiện việc đó chỉ với một lần đề cập đến cột.
Đoạn mã bên dưới thay đổi chiều rộng của trường "họ tên" từ 250 thành 50.
ALTER TABLE `members` MODIFY `fullname` char(50) NOT NULL;
Thực thi lệnh này trên myflixdb rồi chạy tiếp script SHOW COLUMNS sẽ cho ra kết quả như hình bên dưới.
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| Họ và tên | char (50) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
⚠️ Cảnh báo: Việc thu hẹp một cột sẽ cắt bớt dữ liệu không còn phù hợp. Bất kỳ tên nào dài hơn 50 ký tự đều bị cắt ngắn bởi câu lệnh này, vì vậy hãy kiểm tra giá trị dài nhất hiện có bằng cách sử dụng CHỌN Truy vấn trước khi thu nhỏ một trường.
THAY ĐỔI so với SỬA ĐỔI so với ĐỔI TÊN C
Ba từ khóa này có sự chồng chéo, và việc chọn sai từ khóa là nguyên nhân gây ra lỗi phổ biến nhất trong lĩnh vực này. Bảng dưới đây trình bày chúng cạnh nhau.
| Từ khóa | Đổi tên cột | Thay đổi kiểu dữ liệu và các ràng buộc | Cần tên cũ | Sử dụng điển hình |
|---|---|---|---|---|
| THAY ĐỔI | Có | Có | Vâng, cộng thêm tên mới nữa. | Đổi tên và định nghĩa lại trong cùng một câu lệnh |
| SỬA ĐỔI | Không | Có | Tên được đặt một lần | Mở rộng, thu hẹp hoặc nhập lại nội dung cột |
| ĐỔI TÊN CỘT | Có | Không | Vâng, cộng thêm tên mới nữa. | Chỉ đổi tên từ MySQL 8.0 trở đi |
MySQL Phiên bản 8.0 đã bổ sung thêm tùy chọn thứ tư cho trường hợp đơn giản nhất, đó là đổi tên mà không cần định nghĩa lại bất kỳ phần nào.
ALTER TABLE `members` RENAME COLUMN `fullname` TO `full_name`;
Kiểu dữ liệu và tên đã được xác định. Câu hỏi còn lại là cột mới sẽ nằm ở đâu trong bảng, điều mà từ khóa AFTER sẽ quyết định.
Từ khóa SAU
Theo mặc định, một cột được thêm bằng lệnh ALTER TABLE sẽ nằm ở cuối bảng. Để đặt nó ở một vị trí cụ thể, lệnh ALTER được kết hợp với từ khóa AFTER.
Đoạn mã bên dưới thêm trường “date_of_registration” ngay sau trường date_of_birth trong bảng members.
ALTER TABLE `members` ADD `date_of_registration` date NULL AFTER `date_of_birth`;
Thực thi lệnh này trên myflixdb rồi chạy tiếp script SHOW COLUMNS sẽ cho ra kết quả như hình bên dưới.
| Phần | Kiểu | Null | Key | Mặc định | thêm |
|---|---|---|---|---|---|
| số_thành_viên | int (11) | KHÔNG | PRI | NULL | auto_increment |
| Họ và tên | char (50) | KHÔNG | NULL | ||
| giới | varchar(6) | CÓ | NULL | ||
| ngày_sinh | ngày | CÓ | NULL | ||
| ngày_đăng_ký | ngày | CÓ | NULL | ||
| địa chỉ vật lý | varchar(255) | CÓ | NULL | ||
| địa chỉ bưu điện | varchar(255) | CÓ | NULL | ||
| số_liên_hệ | varchar(75) | CÓ | NULL | ||
| varchar(255) | CÓ | NULL |
Hàng được tô sáng là cột được thêm vào sau cột ngày sinh. Từ khóa FIRST hoạt động tương tự và di chuyển cột mới lên đầu bảng.
