Dữ liệu có thể nhiều, nhưng không phải cái nào cũng hữu ích. Để bảng không thành bãi rác, PostgreSQL cho phép đặt constraint. Nó giống như mấy quy tắc đơn giản, để không ai ghi số vào trường "tên" hoặc để trống nó.
Constraint là gì?
Constraint trong PostgreSQL giống như quy tắc hành xử trong quân đội vậy. Nếu không có, ai cũng làm gì cũng được: ghi tuổi user là -999, thêm chuỗi rỗng thay cho tên hoặc ghi hai lần cùng một sinh viên với id khác nhau. Để tránh chuyện đó, PostgreSQL có mấy cơ chế kiểm soát gọi là constraint.
Constraint giúp bạn:
- Giữ cho dữ liệu của bạn hợp lệ và nhất quán.
- Đảm bảo dữ liệu tuân theo quy tắc nhất định (ví dụ, tuổi người không thể âm).
- Giúp phát hiện lỗi nhanh hơn nếu dữ liệu không như bạn mong đợi.
Hôm nay mình sẽ nói về hai constraint phổ biến nhất: NOT NULL và UNIQUE.
Constraint NOT NULL
Constraint NOT NULL bảo PostgreSQL: "Ê, trường này lúc nào cũng phải có giá trị nha. Không được mập mờ ở đây đâu!". Nếu bạn thử thêm dòng có NULL vào bảng, PostgreSQL sẽ báo lỗi liền. Cái này đặc biệt hữu ích cho mấy trường bắt buộc, như tên hay ngày sinh của sinh viên.
Ví dụ dùng NOT NULL
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- Định danh duy nhất
name VARCHAR(100) NOT NULL, -- Tên giảng viên (bắt buộc)
subject VARCHAR(50) NOT NULL -- Môn dạy (bắt buộc)
);
Trong ví dụ này, cột name và subject không được để trống. Nếu bạn thử chèn dòng mà không điền giá trị cho hai cột này, sẽ bị lỗi ngay.
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
Kết quả: lỗi! Bạn chưa điền tên giảng viên, mà name thì bắt buộc phải có giá trị.
Constraint UNIQUE: yêu cầu duy nhất
Constraint UNIQUE đảm bảo giá trị trong một cột hoặc tổ hợp cột không bị trùng nhau. Cái này hữu ích nếu bạn muốn chắc chắn hai sinh viên không có cùng số sổ sinh viên chẳng hạn.
Nếu NOT NULL giống như yêu cầu "tất cả khách phải mặc đồ", thì UNIQUE là "không ai được mặc trùng váy ở party".
Ví dụ dùng UNIQUE
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- Định danh duy nhất
name VARCHAR(100) UNIQUE -- Tên phòng ban phải duy nhất
);
Bây giờ bạn không thể thêm hai phòng ban cùng tên nữa.
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
Kết quả: lỗi! Thử chèn dòng có giá trị trùng trong cột name.
Constraint UNIQUE kết hợp
Bạn cũng có thể đặt duy nhất cho tổ hợp hai (hoặc nhiều) cột. Ví dụ:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- Định danh duy nhất cho bản ghi
student_id INTEGER NOT NULL, -- ID sinh viên
course_id INTEGER NOT NULL, -- ID khóa học
UNIQUE (student_id, course_id) -- Một sinh viên không thể đăng ký cùng một khóa hai lần
);
Bây giờ mỗi cặp student_id và course_id phải duy nhất. Nếu ai đó thử đăng ký cùng sinh viên vào cùng khóa hai lần, PostgreSQL sẽ chặn lại.
Kết hợp constraint: NOT NULL và UNIQUE
Bạn có thể kết hợp NOT NULL và UNIQUE cho một cột. Ví dụ:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- Tài khoản duy nhất, bắt buộc điền
email VARCHAR(100) NOT NULL UNIQUE -- Email duy nhất, bắt buộc điền
);
Ở đây tài khoản và email đều phải duy nhất và không được để trống.
Lỗi thường gặp khi dùng constraint
Nếu bạn dùng UNIQUE cho cột mà không thêm NOT NULL, thì có thể chèn nhiều dòng với giá trị NULL, vì PostgreSQL coi NULL không bằng NULL khác. Nếu muốn cấm giá trị trống, nhớ thêm NOT NULL nhé.
Thử chèn giá trị trùng vào cột có constraint UNIQUE sẽ bị lỗi. Luôn kiểm tra dữ liệu đầu vào trước khi INSERT.
Dùng quá nhiều constraint có thể làm giảm hiệu năng khi chèn dữ liệu.
Tại sao cần mấy cái này?
Dùng constraint giúp tránh nhiều vấn đề như trùng dữ liệu, dòng trống và các lỗi khác do con người gây ra. Nó làm database của bạn "tự bảo vệ", mà với dự án lớn thì tiết kiệm thời gian cực kỳ. Đi phỏng vấn người ta hay hỏi về constraint lắm, nên biết NOT NULL và UNIQUE không chỉ là kỹ năng hữu ích mà còn gây ấn tượng với nhà tuyển dụng tương lai nữa.
Bài sau mình sẽ nói về constraint DEFAULT, cho phép đặt giá trị mặc định cho cột nếu user không nhập gì. Hẹn gặp lại nhé!
GO TO FULL VERSION