PostgreSQL

Ràng buộc NOT NULL – Có cho phép lưu trữ NULL trong cột hay không

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không
Được viết bởi Minh Hoàng

Series chia sẻ về PostgreSQL – Cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới.

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

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

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
);

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (1)

Xem thông tin các cột idname của bảng friends đã tạo:

¥d myschema.friends

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (2)

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 idname:

INSERT INTO myschema.friends VALUES (1, 'Hoang Ngoc Minh');

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (3)

Dữ liệu đã được thêm vào thành công.

Tiếp theo, thêm dữ liệu vào cột idNULL

INSERT INTO myschema.friends VALUES (NULL, 'Hoang Ngoc Minh');
Hoặc:
INSERT INTO myschema.friends (name) VALUES ('Hoang Ngoc Minh');

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (4)

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);

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (5)

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

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

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (6)

Bây giờ thêm ràng buộc NOT NULL cho cột name:

ALTER TABLE students
ALTER COLUMN name SET NOT NULL;

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (7)

Và kết quả là ràng buộc NOT NULL đã được thêm cho cột name:

\d students

Ràng buộc NOT NULL - Có cho phép lưu trữ NULL trong cột hay không (8)

4. Trường hợp đặc biệt của ràng buộc NOT NULL

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),
	('', '');
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!
0 0 vote
Article Rating

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

guest
2 Comments
Thích nhiều nhất
Mới nhất Cũ nhất
Inline Feedbacks
View all comments
trackback

[…] 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 […]

trackback

[…] 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 […]

Translate »
2
0
Would love your thoughts, please comment.x