Câu lệnh ALTER TABLE là một trong những câu lệnh được sử dụng thường xuyên nhất trong thế giới MySQL - câu lệnh cho phép bạn thêm, xóa hoặc sửa đổi các cột trong bảng. Trong bài đăng blog này, chúng tôi sẽ cố gắng tìm hiểu sâu hơn về nó là gì, nó có tác dụng gì và khi nào thì nên sử dụng nó.
ALTER TABLE là gì và nó có tác dụng gì?
Như đã đề cập ở trên, câu lệnh ALTER TABLE cho phép các DBA và nhà phát triển thêm, xóa hoặc sửa đổi các cột trong bảng. Đơn giản chỉ cần đặt ALTER TABLE thay đổi cấu trúc của bảng - nó cho phép bạn thêm, xóa cột, thêm hoặc xóa chỉ mục, đổi tên cột hoặc thay đổi kiểu của chúng.
Khi nào và làm cách nào để sử dụng ALTER TABLE?
Để sử dụng ALTER TABLE, bạn thường cần các đặc quyền ALTER, CREATE và INSERT. Để đổi tên bảng, các đặc quyền bắt buộc là ALTER và DROP cho bảng cũ, sau đó các đặc quyền CREATE, ALTER và INSERT cho bảng mới sẽ được tạo. Để gán các đặc quyền cần thiết cho một người dùng nhất định, bạn có thể sử dụng truy vấn sau:
GRANT ALTER, CREATE, INSERT ON database.* TO 'demo_user';
Thay thế cơ sở dữ liệu bằng tên cơ sở dữ liệu của bạn, ký tự đại diện bằng tên bảng nếu bạn muốn các đặc quyền chỉ áp dụng cho một số bảng nhất định (ký tự đại diện làm cho đặc quyền có thể áp dụng trên tất cả các bảng) và demo_user với tên của người dùng của bạn. Nếu bạn muốn các đặc quyền được sử dụng trên tất cả các cơ sở dữ liệu và tất cả các bảng bên trong chúng, chỉ cần thay thế cơ sở dữ liệu bằng một ký tự đại diện:
GRANT ALTER, CREATE, INSERT ON *.* TO 'demo_user';
Để thực sự sử dụng câu lệnh ALTER TABLE, hãy chạy truy vấn thay đổi cấu trúc của bảng - ALTER TABLE được sử dụng để thêm, xóa hoặc sửa đổi các cột trong bảng:truy vấn cũng có thể được sử dụng để thêm chỉ mục vào cột. Dưới đây là một vài ví dụ cơ bản về các truy vấn được sử dụng thường xuyên nhất:
ALTER TABLE demo_table ADD column_name VARCHAR(255) NOT NULL DEFAULT ‘’; T
truy vấn của anh ấy sẽ thêm một cột column_name vào một bảng demo_table. Thêm FIRST vào cuối truy vấn để làm cho cột này trở thành cột đầu tiên trong bảng.
ALTER TABLE demo_table ADD column_2 VARCHAR(255) NOT NULL DEFAULT ‘’ AFTER column_1; T
truy vấn của anh ấy sẽ thêm một cột cột_2 sau cột cột_1 trên bảng demo_table.
ALTER TABLE demo_table ADD COLUMN column_2 INT GENERATED ALWAYS AS (column_1 + 1) STORED;
Truy vấn này sẽ thêm một cột đã tạo vào bảng.
ALTER TABLE demo_table DROP COLUMN demo_column;
Truy vấn này sẽ thả cột demo_column vào bảng demo_table.
ALTER TABLE demo_table ADD INDEX demo_index(demo_column);
Truy vấn này sẽ thêm một chỉ mục có tên demo_index (có thể chọn tên) trên một cột có tên là demo_column trong một bảng được gọi là demo_table.
ALTER TABLE demo_table ADD INDEX (demo_column), ADD UNIQUE (demo_unique);
Truy vấn này sẽ thêm một chỉ mục trên cột demo_column và một chỉ mục duy nhất trên cột demo_unique.
ALTER TABLE demo_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4;
Truy vấn này sẽ thay đổi bộ ký tự mặc định của một cột cụ thể.
ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name;
Truy vấn này sẽ thay đổi bộ ký tự mặc định của bảng và tất cả các cột ký tự (CHAR, VARCHAR và TEXT).
ALTER TABLE demo_table PARTITION BY HASH(demo_column) PARTITIONS 8;
Truy vấn này sẽ phân chia cột demo_column thành 8 phân vùng theo hàm băm.
ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK;
Truy vấn này sẽ chuyển đổi bảng demo_table thành bộ nhớ dựa trên đĩa.
Nếu bạn đang thêm chỉ mục, hãy nhớ rằng bạn có thể thêm các loại chỉ mục khác nhau (ví dụ:chỉ mục BTREE hoặc chỉ mục FULLTEXT), bạn cũng có thể thêm chỉ mục chỉ bao gồm một số lượng nhất định các ký tự trong một cột có truy vấn như sau:
ALTER TABLE demo_table ADD INDEX demo_index(column_name(10));
Truy vấn trên sẽ thêm một chỉ mục có tên là demo_index trên 10 ký tự đầu tiên của cột có tên là column_name trong một bảng được gọi là demo_table.
Các chỉ mục trong MySQL là một con thú phức tạp và chúng thực sự xứng đáng là một chủ đề của riêng chúng, vì vậy chúng tôi sẽ không đi vào chi tiết ở đây, nhưng nếu bạn muốn tìm hiểu thêm, bài đăng trước của chúng tôi về các chỉ mục MySQL sẽ cung cấp một số hiểu biết sâu sắc hơn.
ALTER TABLE hoạt động như thế nào?
ALTER TABLE trong MySQL có những nét tinh tế riêng. Kể từ phiên bản MySQL mới nhất, tức là MySQL 8.0. Có 3 thuật toán ảnh hưởng đến cách ALTER TABLE hoạt động cho những thay đổi như vậy. Đây là:
-
SAO CHÉP
-
Các thao tác được thực hiện trên bản sao của bảng gốc và dữ liệu bảng được sao chép từ bảng gốc sang từng hàng của bảng mới. Trong hầu hết các trường hợp, thuật toán này có thể rất tốn kém về việc sử dụng tài nguyên, đặc biệt là đối với các bảng lớn và lớn. Khi thuật toán này được chọn hoặc được chọn, tất cả DML đồng thời không được phép, do đó, bất kỳ truy vấn tiếp theo nào tham chiếu đến bảng bị ảnh hưởng sẽ phải chờ hoặc xếp hàng vào danh sách quy trình. Rất có thể, bạn sẽ gặp sự cố cơ sở dữ liệu của mình nếu các kết nối đã được sử dụng hết.
-
-
INPLACE
-
Các thao tác tránh sao chép dữ liệu bảng nhưng có thể tạo lại bảng tại chỗ. Khóa siêu dữ liệu độc quyền trên bảng có thể được thực hiện trong thời gian ngắn trong giai đoạn chuẩn bị và thực hiện hoạt động. Thông thường, DML đồng thời được hỗ trợ.
-
-
NGAY LẬP TỨC
-
Các thao tác chỉ sửa đổi siêu dữ liệu trong từ điển dữ liệu. Không có khóa siêu dữ liệu độc quyền nào được thực hiện trên bảng trong quá trình chuẩn bị và thực thi, đồng thời dữ liệu bảng không bị ảnh hưởng, giúp cho các hoạt động diễn ra tức thời. DML đồng thời được cho phép. (Được giới thiệu trong MySQL 8.0.12)
-
Quy trình ALTER TABLE của MySQL có thể không phải là vấn đề với các bảng nhỏ hơn, nhưng nếu tập dữ liệu của bạn lớn hơn, bạn có thể gặp sự cố - nhiều người đã gặp phải các truy vấn ALTER TABLE mất hàng giờ, hàng ngày hoặc thậm chí hàng tuần hoàn thành. Trong hầu hết các trường hợp, điều đó xảy ra do quá trình thay đổi bảng của MySQL được nêu ở trên. Tuy nhiên, có một cách để giảm ít nhất một chút thời gian hoàn thành truy vấn:
- Tạo một bảng mới giống như bảng nguồn với cấu trúc mong muốn của bạn bằng cách chạy
sau đó điều chỉnh cấu trúc của nó. Trong trường hợp này, demo_table là bảng nguồn và demo_table_new là bảng mới.CREATE TABLE demo_table_new LIKE demo_table;
- Chèn dữ liệu vào bảng mới.
- Đổi tên bảng cũ thành demo_table_old (điều chỉnh tên theo ý bạn).
- Đổi tên bảng mới thành tên cũ của bảng cũ.
- Cuối cùng, sao chép các hàng từ bảng cũ sang bảng mới và tạo chỉ mục nếu cần.
Mặc dù các bước trên hoạt động tốt. Tuy nhiên, trong các tình huống trường hợp thực tế, DBA hoặc các nhà phát triển có xu hướng sử dụng pt-online-schema-change của Percona hoặc sử dụng gh-ost của Github. Bạn có thể xem bài đăng trước của chúng tôi Các công cụ nguồn mở hàng đầu cho MySQL &MariaDB Migrations, bài viết này có cái nhìn tổng quan về các công cụ thay đổi lược đồ này.
Dù sao, những gì chúng tôi đã mô tả ở trên thường được gọi là phương pháp tiếp cận "bản sao bóng":về bản chất, bạn tạo một bảng mới với cấu trúc mong muốn, sau đó thực hiện đổi tên và thả để hoán đổi hai bảng. . Ngoài ra còn có một cách khác:bạn cũng có thể hoán đổi các máy chủ và chạy ALTER TABLE trên các máy chủ không được sản xuất. Đối với MyISAM, bạn có thể BẬT CÁC KHÓA, tải dữ liệu, sau đó BẬT CÁC KHÓA.
Gotchas BẢNG ALTER
Nếu bạn đang sử dụng câu lệnh ALTER TABLE để tạo chỉ mục (bạn cũng có thể sử dụng câu lệnh CREATE INDEX), bạn nên tạo chỉ mục sau khi chèn dữ liệu vì đó là một cách khá nổi tiếng để tăng tốc xử lý không chỉ trong MySQL mà còn trong các hệ quản trị cơ sở dữ liệu khác, chẳng hạn như Oracle. Mặc dù vậy, nói chung, hãy nhớ rằng hầu hết các hoạt động ALTER TABLE sẽ gây ra một số vấn đề (gián đoạn dịch vụ) đối với MySQL.
Ngoài ra còn có một cách khác để tăng tốc toàn bộ quá trình, mặc dù nó nâng cao hơn một chút:nếu bạn có thể thuyết phục MySQL chỉ sửa đổi tệp .frm của bảng (tệp .frm mô tả định nghĩa của bảng) và để nguyên bảng, quá trình sẽ nhanh hơn:
- Tạo một bảng trống có cùng bố cục với bảng cũ mà không cần sửa đổi nó.
- Đóng tất cả các bảng đang sử dụng và ngăn tất cả các bảng mới được mở bằng cách chạy
FLUSH TABLES WITH READ LOCK.
- Hoán đổi các tệp .frm.
- Giải phóng khóa đọc bằng cách chạy UNLOCK TABLES.
Cũng nên nhớ rằng nếu bạn muốn sửa đổi một cột và cú pháp có vẻ đúng nhưng bạn vẫn gặp lỗi, có thể đã đến lúc phải xem xét một cú pháp khác. Ví dụ:
ALTER TABLE demo_table ADD long VARCHAR(255);
Một truy vấn như thế này sẽ xảy ra lỗi vì long là một từ dành riêng. Để tránh lỗi như vậy, hãy thoát khỏi từ bằng dấu gạch ngược:
ALTER TABLE demo_table ADD `long` VARCHAR(255);
Cũng cần lưu ý rằng tên cột chỉ có thể được thoát bằng dấu gạch ngược và không được sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép. Ví dụ:một truy vấn như vậy cũng sẽ xảy ra lỗi:
ALTER TABLE demo_table CHANGE COLUMN ‘demo_column’ ‘demo_column_2’ VARCHAR(255);
Tóm tắt
MySQL sử dụng câu lệnh ALTER TABLE để thêm, xóa hoặc sửa đổi các cột trong bảng. Để câu lệnh được thực thi thành công, bạn phải có các đặc quyền ALTER, CREATE và INSERT cho bảng. Câu lệnh cũng có một vài điểm tinh tế độc đáo:hiệu suất của nó có thể bị ảnh hưởng khi chạy trên các bảng rất lớn do cách thức hoạt động của nó, nhưng miễn là bạn biết cách hoạt động của câu lệnh và nó làm gì thì bạn sẽ ổn thôi.