Nếu thêm ràng buộc NOT NULL vào cột khi tạo bảng thì bạn không thể lưu trữ giá trị NULL trong cột.
Bài viết này sẽ giải thích cách sử dụng ràng buộc NOT NULL trong PostgreSQL để đảm bảo các giá trị của một cột không rỗng.
1. Giới thiệu về NULL
Trong lý thuyết cơ sở dữ liệu, NULL đại diện cho thông tin không xác định hoặc bị thiếu. NULL không phải là một chuỗi rỗng (empty string) hay số không (number zero).
Giả sử rằng cần chèn địa chỉ email của một thông tin liên hệ vào bảng. Bạn có thể yêu cầu địa chỉ email của họ. Tuy nhiên, nếu không biết liệu người liên hệ có địa chỉ email hay không, bạn có thể chèn NULL vào cột địa chỉ email. Trong trường hợp này, NULL chỉ ra rằng địa chỉ email không được biết tại thời điểm ghi.
NULL rất đặc biệt. Nó không bằng bất cứ thứ gì, ngay cả bản thân nó. Biểu thức NULL = NULL trả về IS NULL vì nó có nghĩa là hai giá trị chưa biết không được bằng nhau.
Để kiểm tra xem một giá trị có phải là NULL hay không, bạn sử dụng toán tử boolean IS NULL. Ví dụ, biểu thức sau trả về true nếu giá trị trong địa chỉ email là NULL
email_address IS NULL
Toán tử IS NOT NULL phủ định kết quả của toán tử IS NULL
2. Cách sử dụng ràng buộc NOT NULL
Để kiểm soát xem một cột có thể chấp nhận NULL hay không, bạn sử dụng ràng buộc NOT NULL:
CREATE TABLE [ IF NOT EXISTS ] table_name ( column_name data_type [NOT NULL] [NULL] [, ... ] );
Khi tạo bảng có thể chỉ định NOT NULL hoặc NULL cho cột. Nếu một cột có ràng buộc NOT NULL, bất kỳ nỗ lực nào để chèn hoặc cập nhật NULL trong cột sẽ dẫn đến lỗi.
Ví dụ: tạo bảng friends trong lược đồ myschema của cơ sở dữ liệu mydb:
CREATE TABLE myschema.friends ( id integer NOT NULL, name varchar(50) NULL );
Xem thông tin các cột id và name của bảng friends đã tạo:
¥d myschema.friends
Giá trị trong cột Null 値を許容 của cột id được hiển thị là not null.
Bây giờ sẽ thêm một số dữ liệu vào bảng myschema.friends.
Đầu tiên, thêm dữ liệu có giá trị không phải là NULL vào cột id và name:
INSERT INTO myschema.friends VALUES (1, 'Hoang Ngoc Minh');
Dữ liệu đã được thêm vào thành công.
Tiếp theo, thêm dữ liệu vào cột id là NULL
INSERT INTO myschema.friends VALUES (NULL, 'Hoang Ngoc Minh'); Hoặc: INSERT INTO myschema.friends (name) VALUES ('Hoang Ngoc Minh');
Vì ràng buộc NOT NULL được đặt cho cột id nên việc thêm dữ liệu NULL hoặc thêm thiếu dữ liệu của cột id thì sẽ không thành công với lỗi “ERROR: Null value in column “id” violates NOT NULL constraint“.
Cuối cùng, thêm dữ liệu NULL vào cột name:
INSERT INTO myschema.friends VALUES (2, NULL);
Vì ràng buộc NOT NULL không được đặt cho cột name nên việc thêm dữ liệu NULL là OK.
3. Cách thêm ràng buộc NOT NULL cho cột của bảng
Để thêm ràng buộc NOT NULL vào một cột của bảng hiện có, bạn sử dụng lệnh ALTER TABLE như sau:
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;
Để thêm tập hợp nhiều ràng buộc NOT NULL vào nhiều cột, bạn sử dụng cú pháp sau:
ALTER TABLE table_name ALTER COLUMN column_name_1 SET NOT NULL, ALTER COLUMN column_name_2 SET NOT NULL, ...;
Xem thông tin các cột hiện có của bảng students trong lược đồ public của cơ sở dữ liệu mydb:
\d students
Bây giờ thêm ràng buộc NOT NULL cho cột name:
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
Và kết quả là ràng buộc NOT NULL đã được thêm cho cột name:
\d students
4. Trường hợp đặc biệt của ràng buộc NOT NULL
Bên cạnh ràng buộc NOT NULL, bạn có thể sử dụng ràng buộc CHECK để buộc một cột chấp nhận các giá trị không NULL. Ràng buộc NOT NULL tương đương với ràng buộc CHECK sau:
CHECK(column_name IS NOT NULL)
Điều này rất hữu ích vì đôi khi bạn có thể muốn cột a hoặc b không rỗng, nhưng không phải cả hai.
Ví dụ, bạn có thể muốn chỉ username hoặc chỉ email của bảng user không được rỗng hoặc trống. Trong trường hợp này, bạn có thể sử dụng ràng buộc CHECK như sau:
CREATE TABLE users ( id serial PRIMARY KEY, username VARCHAR (50), password VARCHAR (50), email VARCHAR (50), CONSTRAINT username_email_notnull CHECK ( NOT ( ( username IS NULL OR username = '' ) AND ( email IS NULL OR email = '' ) ) ) );
Khi đó, các giá trị thêm vào bảng như sau sẽ OK:
INSERT INTO users (username, email) VALUES ('user1', NULL), (NULL, 'admin@minhhn.com'), ('user2', 'minhhn.com@gmail.com'), ('user3', '');
và các giá trị thêm sau sẽ NG:
INSERT INTO users (username, email) VALUES (NULL, NULL), (NULL, ''), ('', NULL), ('', '');
[…] mặt kỹ thuật, một ràng buộc khóa chính là sự kết hợp của một ràng buộc not-null và một ràng buộc […]
[…] chỉ định GENERATED ALWAYS AS IDENTITY sẽ thiết lập cột id tự động ràng buộc NOT NULL, chứ không ràng buộc PRIMARY KEY nên hoàn toàn có thể thêm giá trị của cột id […]