Khóa học
Trong SQL, chủ yếu có ba loại lệnh -
-
DDL - viết tắt của Data Definition Language (Ngôn ngữ Định nghĩa Dữ liệu), bao gồm các lệnh SQL dùng để định nghĩa cơ sở dữ liệu như tạo bảng, cung cấp đặc tả, chỉnh sửa bảng, v.v. Ví dụ về DDL gồm
CREATE,DROP,ALTER,... Các thay đổi do lệnh DDL gây ra không thể hoàn tác. -
DML - viết tắt của Data Manipulation Language (Ngôn ngữ Thao tác Dữ liệu), cho phép bạn chạy các truy vấn select, insert, update và delete. Các thay đổi do lệnh DML gây ra có thể được hoàn tác. Ví dụ -
SELECT,INSERT,UPDATEvàDELETE. -
DCL - viết tắt của Data Control Language (Ngôn ngữ Kiểm soát Dữ liệu), cho phép bạn chỉ định quyền, cấp phép và các kiểm soát khác của hệ thống cơ sở dữ liệu.
Trong hướng dẫn này, bạn sẽ xem cách sử dụng câu lệnh ALTER TABLE thuộc nhóm DDL. Các nội dung sau sẽ được đề cập trong hướng dẫn -
- Nhu cầu sử dụng câu lệnh
ALTER TABLE - Tạo một bảng trong cơ sở dữ liệu PostgreSQL
- Thực thi các câu lệnh
ALTER TABLEkhác nhau trong PostgreSQL
Lưu ý: Hướng dẫn này sẽ không dạy cách tạo bảng, chèn dữ liệu vào bảng, hay truy vấn dữ liệu từ bảng trong PostgreSQL. Nếu bạn cần ôn lại các chủ đề này, hãy xem bài viết này.
Nhu cầu sử dụng câu lệnh ALTER TABLE
Các đặc tả của cơ sở dữ liệu có thể thay đổi theo thời gian. Chẳng hạn, bạn có thể cần thêm một cột vào một bảng cụ thể, hoặc cần thêm một khóa chính khác cho một bảng. Bạn cũng có thể cần thay đổi kiểu dữ liệu của một cột nhất định trong bảng. Bạn khó có thể xoá bảng và tạo lại từ đầu. Câu lệnh Alter Table cho phép bạn thực hiện tất cả những việc này một cách trơn tru. Với Alter Table, bạn có thể -
- Thêm, sửa đổi hoặc xoá một cột
- Thêm hoặc xoá một ràng buộc (constraint)
Bạn cũng có thể bật/tắt các ràng buộc, nhưng nội dung đó không nằm trong phạm vi của hướng dẫn này.
Bạn sẽ thấy từng trường hợp sử dụng ở trên trong hướng dẫn này, nhưng trước đó, bạn sẽ cần một bảng trong PostgreSQL để bắt đầu. Ở phần tiếp theo, bạn sẽ tạo một bảng đơn giản.
Tạo một bảng trong cơ sở dữ liệu PostgreSQL
Bạn sẽ tạo một bảng tên student_details trong PostgreSQL (sử dụng tiện ích pgAdmin) với các cột và kiểu dữ liệu sau -
- student_id (integer)
- student_full_name (character)
- student_year (integer)
Bạn sẽ bắt đầu với bảng chỉ gồm ba cột này. Sau đó, khi đi tiếp trong hướng dẫn, bạn sẽ thêm nhiều cột hơn và thay đổi bảng theo các cách khác nhau. Truy vấn tạo bảng sau sẽ tạo bảng theo đúng các đặc tả trên -
CREATE TABLE student_details(
student_id SERIAL,
student_full_name VARCHAR (50),
student_year VARCHAR (100)
);
Hãy chèn một vài bản ghi vào bảng này nữa -
INSERT INTO student_details(student_full_name, student_year) VALUES('John Doe','1st');INSERT INTO student_details(student_full_name, student_year) VALUES('Chris Villa','3rd');
Vì kiểu dữ liệu của student_id được đặt là SERIAL nên PostgreSQL sẽ tự động tăng giá trị của cột và kiểu dữ liệu này mặc định được hiểu là integer trong PostgreSQL.
Bảng student_details sẽ trông như sau -

Giờ bạn đã có một bảng trong PostgreSQL. Hãy xem các cách áp dụng khác của Alter Table ở phần tiếp theo.
Thực thi các câu lệnh ALTER TABLE khác nhau trong PostgreSQL
Trong phần này, bạn sẽ xem cách dùng câu lệnh Alter Table theo hai cách sau như đã đề cập -
- Thêm, sửa đổi và xoá một cột
- Thêm và xoá một ràng buộc
Thêm, sửa đổi hoặc xoá một cột
Bắt đầu bằng cách thêm một cột nữa tên là student_grade (kiểu ký tự) vào bảng -
ALTER TABLE student_details ADD student_grade VARCHAR(5);
Giờ, bảng sẽ như sau -

Lưu ý rằng với các bản ghi bạn đã chèn trước đó, giá trị ở cột student_grade là null. Điều này hầu hết các hệ quản trị CSDL quan hệ thực hiện ngầm định. Tuy nhiên, bạn luôn có thể chạy truy vấn update để cập nhật giá trị. Giờ hãy xem cách sửa đổi một cột bằng Alter Table. Bạn sẽ đổi kích thước tối đa cho cột student_year từ 100 xuống 10 vì cấp quá nhiều không gian cho chỉ ba ký tự (student_year có thể là 1st, 2nd hoặc 3rd) là không thực tế.
ALTER TABLE student_details ALTER COLUMN student_year TYPE VARCHAR(10);
Bạn có thể xem kết quả trong hình sau -

Bạn cũng có thể đổi tên một cột. Hãy xem cách làm -
ALTER TABLE student_details RENAME student_id TO student_roll;
Truy vấn trên đổi tên cột student_id thành student_roll. Bạn cũng có thể kiểm chứng bằng một truy vấn select, và kết quả sẽ giống như hình sau -

Giờ hãy xem cách xoá một cột khỏi bảng -
ALTER TABLE student_details DROP COLUMN student_year;
Truy vấn này xoá cột student_year và bảng sau khi thực thi truy vấn sẽ như sau -

Lưu ý rằng nếu cột bạn đang xoá được tham chiếu bởi một bảng khác, bạn có thể gặp lỗi vi phạm toàn vẹn tham chiếu.
Giờ bạn sẽ xem cách thêm và xoá ràng buộc cho một bảng.
Thêm và xoá ràng buộc.
Bảng student_details chưa có khóa chính. Khóa chính là sự kết hợp của ràng buộc not null và unique. Hãy chỉ định cột student_roll (đã được đổi từ student_id) làm khóa chính của student_details -
ALTER TABLE student_details ADD PRIMARY KEY (student_roll);
Bạn cũng có thể thêm các ràng buộc khác, ví dụ, bạn có thể thêm ràng buộc check cho cột student_grade để giá trị của nó luôn là A, B hoặc C.
ALTER TABLE student_details ADD CONSTRAINT year_check CHECK (student_grade IN ('A', 'B', 'C'));
year_check là tên giữ chỗ cho ràng buộc bạn đang thêm vào bảng. Bây giờ nếu bạn cố gắng chèn bản ghi sau vào bảng, bạn sẽ nhận lỗi -
INSERT INTO student_details(student_full_name, student_grade) VALUES('David Lune','3rd');
Lỗi sẽ trông như sau -

Xoá một ràng buộc cũng tương tự. Bạn cần chỉ định tên ràng buộc muốn xoá. Hãy xoá ràng buộc mà bạn đã đặt tên là year_check -
ALTER TABLE student_details DROP CONSTRAINT year_check;
Hãy kiểm chứng. Nếu ràng buộc year_check thực sự đã được xoá, thì truy vấn này INSERT INTO student_details(student_full_name, student_grade) VALUES('David Lune','3rd'); sẽ không gây ra lỗi. Bảng hiện đã chứa bản ghi -

Bạn có thể thử các ràng buộc check khác nữa.
Kết thúc hướng dẫn!
Hướng dẫn này đã giới thiệu cho bạn câu lệnh Alter Table để hiệu quả thay đổi lược đồ của một bảng. Nếu bạn muốn nâng cao kỹ năng SQL, bạn có thể quan tâm đến các khóa học sau do DataCamp cung cấp -