PostgreSQL

Ràng buộc CHECK – Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định 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.

Bài viết này sẽ mô tả về ràng buộc PostgreSQL CHECK và cách sử dụng để ràng buộc giá trị trong các cột của bảng dựa trên biểu thức boolean.

Ràng buộc CHECK là một loại ràng buộc cho phép bạn chỉ định xem các giá trị trong một cột có phải đáp ứng một yêu cầu cụ thể hay không.

Ràng buộc CHECK sử dụng biểu thức boolean để đánh giá các giá trị trước khi chúng được chèn hoặc cập nhật vào cột.

Nếu các giá trị kiểm tra OK, PostgreSQL sẽ chèn hoặc cập nhật các giá trị này vào cột. Nếu không, PostgreSQL sẽ từ chối các thay đổi và đưa ra lỗi vi phạm ràng buộc.

1. Chỉ định ràng buộc PostgreSQL CHECK khi tạo bảng mới

1. Chỉ định ràng buộc PostgreSQL CHECK khi tạo bảng mới

Khi tạo một bảng mới, bạn có thể đặt ràng buộc CHECK trên cột để đặt điều kiện cho dữ liệu được thêm vào. Định dạng như sau:

CREATE TABLE [ IF NOT EXISTS ] table_name (
  column_name data_type CHECK ( expression ) [, ... ]
);

Đặt biểu thức điều kiện CHECK ( expression ) để kiểm tra dữ liệu được thêm vào cột. Ví dụ: nếu là cột chuỗi ký tự, bạn có thể đặt các điều kiện như giá trị cần thêm không được để trống, và nếu là cột số, bạn có thể đặt điều kiện giá trị cần thêm phải lớn hơn 0. Sẽ xảy ra lỗi nếu dữ liệu được thêm vào không đáp ứng điều kiện chỉ định.

Bạn cũng có thể đặt ràng buộc CHECK trên một bảng thay vì trên cơ sở từng cột:

CREATE TABLE [ IF NOT EXISTS ] table_name (
  column_name1 data_type1, 
  column_name2 data_type2,
  [... ,]
  CHECK ( expression )
);

※Tùy vào mục đích của bạn khi tạo bảng muốn chỉ định ràng buộc CHECK cho từng cột riêng biệt hoặc khi bạn muốn đặt một biểu thức điều kiện cho tất cả các cột của bảng mà sử dụng cú pháp lệnh phù hợp.


Bây giờ sẽ đi vào ví dụ cụ thể. Let’s Go!

Tạo bảng friends với rằng buộc CHECK trên 2 cột idaddress như sau:

CREATE TABLE friends (
  id integer CHECK(id > 0), 
  name varchar(20), 
  address varchar(30) CHECK(address <> '')
);

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (1)

Biểu thức điều kiện được đặt cho cột id là giá trị phải lớn hơn 0 và biểu thức điều kiện giá trị không phải là ký tự rỗng (”) được đặt cho cột address.

\d friends

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (2)

Đầu tiên sẽ thêm tất cả dữ liệu hợp lệ vào bảng friends:

INSERT INTO friends VALUES (1, 'Hoang Ngoc Minh', 'Nagoya, Japan');

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (3)

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

Tiếp theo, thử thêm dữ liệu để giá trị của cột idaddress sẽ là false bởi ràng buộc CHECK:

INSERT INTO friends VALUES (-2, 'Hoang Ngoc Minh', 'Nagoya, Japan');
Hoặc:
INSERT INTO friends VALUES (3, 'Hoang Ngoc Minh', '');

thì đều bị thông báo lỗi giá trị thêm vào không hợp lệ và việc thêm dữ liệu vào bảng friends không thành công.

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (4)

Bằng cách đặt ràng buộc CHECK theo cách này, bạn có thể ngăn không cho dữ liệu có giá trị không khớp với điều kiện đặt trước vào bảng.

2. Thêm ràng buộc PostgreSQL CHECK vào bảng đã tồn tại

2. Thêm ràng buộc PostgreSQL CHECK vào bảng đã tồn tại

Đầu tiên, chúng ta sẽ tạo bảng prices mà không có ràng buộc CHECK nào:

CREATE TABLE prices (
	id serial PRIMARY KEY,
	product_id INT NOT NULL,
	price NUMERIC NOT NULL,
	discount NUMERIC NOT NULL,
	valid_from DATE NOT NULL,
	valid_to DATE NOT NULL
);

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (5)

Kiểm tra thông tin các cột của bảng prices vừa tạo:

\d prices

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (6)

Bây giờ, bạn có thể sử dụng câu lệnh ALTER TABLE để thêm các ràng buộc CHECK vào bảng prices, price và discount phải lớn hơn 0price > discount. Lưu ý rằng chúng ta sử dụng biểu thức boolean chứa các toán tử AND.

ALTER TABLE prices
ADD CONSTRAINT price_discount_check 
CHECK (
	price > 0
	AND discount >= 0
	AND price > discount
);

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (7)

Kiểm tra thông tin các cột của bảng prices, chúng ta thấy các ràng buộc CHECK đã được thêm:

\d prices

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (8)

Cuối cùng, thêm một ràng buộc CHECK nữa là (valid_to >= valid_from)

ALTER TABLE prices
ADD CONSTRAINT valid_range_check 
CHECK (valid_to >= valid_from);

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (9)

Kiểm tra thông tin các cột của bảng prices, chúng ta thấy các ràng buộc CHECK đã được thêm:

\d prices

Ràng buộc CHECK - Kiểm tra dữ liệu được thêm vào có thỏa mãn các điều kiện được chỉ định hay không (10)

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!

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

Translate »