Giờ thì đến lúc nói về cách thay đổi các bảng đã tồn tại rồi. Trong dự án thực tế thì hiếm khi mọi thứ giữ nguyên mãi — yêu cầu mới có thể rơi xuống bất ngờ như bombarđilokrokodilo ấy. Ví dụ, product manager bỗng dưng quyết định mỗi user phải có một mã màu nền profile yêu thích riêng biệt. Hoặc bạn nhận ra VARCHAR(50) cho tên thì quá ngắn, vì trong database đã có user tên là "Bombarđilokrokodilo-Junior-Thu-ba".
Vậy thì, trong PostgreSQL có công cụ cho mấy vụ này — lệnh ALTER TABLE.
ALTER TABLE — là lệnh cho phép thay đổi cấu trúc của bảng đã có. Dùng nó bạn có thể:
- Thêm cột mới;
- Xóa cột không cần thiết;
- Đổi kiểu dữ liệu của cột;
- Đổi tên bảng hoặc cột;
- Thêm hoặc xóa ràng buộc như
NOT NULL,UNIQUE, và nhiều thứ khác nữa.
Nói nôm na, nó giống như bạn đã xây xong cái nhà (bảng), giờ muốn thêm phòng mới (cột) hoặc phá bỏ cái kho không dùng đến (xóa cột).
Cú pháp ALTER TABLE
Cấu trúc chung của lệnh này khá là dễ hiểu:
ALTER TABLE bảng
hành_động_thay_đổi;
Trong đó:
bảng— tên bảng bạn muốn thay đổi;-
hành_động_thay_đổi— hành động cụ thể bạn muốn thực hiện (ví dụ thêm cột, xóa cột hoặc đổi kiểu dữ liệu).
Ví dụ dùng ALTER TABLE
Thêm cột mới
Nếu bạn muốn thêm cột mới vào bảng, dùng lệnh ADD COLUMN. Ví dụ:
ALTER TABLE students
ADD COLUMN email VARCHAR(100);
Lệnh này sẽ thêm cột email vào bảng students, dùng để lưu địa chỉ email của sinh viên. Kiểu dữ liệu là chuỗi tối đa 100 ký tự.
Giả sử bạn đã tạo bảng students nhưng quên thêm thông tin ngày nhập học. Đây là cách sửa:
ALTER TABLE students
ADD COLUMN enrollment_date DATE;
Giờ bạn đã có cột enrollment_date để lưu ngày nhập học rồi nhé.
Xóa cột
Nếu bạn thấy cột nào đó không cần nữa, dùng lệnh DROP COLUMN. Ví dụ:
ALTER TABLE students
DROP COLUMN email;
Lệnh này sẽ xóa cột email khỏi bảng students. Lưu ý là dữ liệu trong cột này cũng sẽ bị xóa không thể khôi phục nhé.
Lưu ý quan trọng:
Nếu bạn cố xóa cột đang được dùng ở bảng khác (ví dụ làm khóa ngoại), PostgreSQL có thể báo lỗi. Khi đó phải xóa các phụ thuộc trước đã.
Đổi kiểu dữ liệu của cột
Có lúc kiểu dữ liệu ban đầu chọn không hợp lý. Ví dụ, bạn lưu tuổi sinh viên bằng SMALLINT, sau lại thấy không đủ, muốn chuyển sang BIGINT. Làm như này:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
Lưu ý quan trọng: nếu cột đã có dữ liệu, PostgreSQL sẽ kiểm tra xem có chuyển được sang kiểu mới không. Nếu không chuyển được thì sẽ báo lỗi.
Ví dụ, bạn tạo cột description là VARCHAR(100), sau lại thấy mô tả khóa học có thể dài hơn nhiều. Đổi sang kiểu TEXT nhé:
ALTER TABLE courses
ALTER COLUMN description TYPE TEXT;
Giờ bạn có thể lưu mô tả khóa học dài tẹt ga mà không lo giới hạn ký tự.
Đổi tên cột
Nếu cần đổi tên cột, dùng lệnh RENAME COLUMN:
ALTER TABLE students
RENAME COLUMN name TO full_name;
Giờ cột name đã thành full_name rồi nhé.
Đổi tên bảng
Bạn cũng có thể đổi tên bảng luôn. Dùng lệnh RENAME TO:
ALTER TABLE students
RENAME TO university_students;
Giờ bảng students đã thành university_students rồi.
Thêm/xóa ràng buộc NOT NULL
Giả sử bạn tạo cột mà quên không bắt buộc phải có giá trị (NOT NULL). Không sao! Bạn có thể thêm ràng buộc này sau:
ALTER TABLE students
ALTER COLUMN name SET NOT NULL;
Nếu muốn bỏ ràng buộc NOT NULL, dùng lệnh DROP NOT NULL:
ALTER TABLE students
ALTER COLUMN name DROP NOT NULL;
Đặt giá trị mặc định
Nếu cột đã có rồi mà bạn muốn đặt giá trị mặc định, dùng SET DEFAULT:
ALTER TABLE enrollments
ALTER COLUMN enrollment_date SET DEFAULT CURRENT_DATE;
Muốn bỏ giá trị mặc định thì làm như này:
ALTER TABLE enrollments
ALTER COLUMN enrollment_date DROP DEFAULT;
Mấy lệnh này sẽ được nói kỹ hơn trong ba bài giảng tiếp theo. Chuẩn bị tinh thần nha :)
Lỗi thường gặp khi dùng ALTER TABLE
Khi làm việc với ALTER TABLE có thể gặp lỗi. Đây là mấy lỗi phổ biến nhất:
Cố đổi kiểu dữ liệu không tương thích với dữ liệu hiện tại. Ví dụ, nếu cột age đã có dữ liệu mà bạn muốn chuyển sang chuỗi VARCHAR, sẽ bị lỗi. Cách xử lý: xóa hoặc chuyển đổi dữ liệu trước.
Cố xóa cột đang làm khóa ngoại hoặc index. PostgreSQL sẽ không cho xóa để đảm bảo toàn vẹn dữ liệu. Trước khi xóa cột phụ thuộc phải xóa liên kết trước.
Lỗi cú pháp. Lệnh ALTER TABLE khá linh hoạt nhưng phải đúng cú pháp. Ví dụ, lệnh ADD COLUMN phải có kiểu dữ liệu.
Tình huống thực tế
Trong thực tế, lệnh ALTER TABLE dùng suốt luôn. Bạn sẽ gặp nó khi:
- Thêm dữ liệu mới vào bảng đã có (ví dụ thêm cột mới);
- Tối ưu database (ví dụ đổi kiểu dữ liệu để giảm dung lượng bộ nhớ);
- Sửa lỗi thiết kế (ví dụ quên ràng buộc hoặc chọn sai kiểu dữ liệu ban đầu).
Giờ thì bạn đã hiểu lệnh ALTER TABLE mạnh cỡ nào rồi đó. Đây là công cụ cực kỳ hữu ích giúp bạn thích nghi với thay đổi trong dự án. Quan trọng là phải cẩn thận, đừng vội vàng kẻo lại "phá nhà" (bảng của bạn) khi đang xây thêm phòng mới.
GO TO FULL VERSION