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
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 id và address như sau:
CREATE TABLE friends ( id integer CHECK(id > 0), name varchar(20), address varchar(30) CHECK(address <> '') );
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
Đầ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');
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 id và address 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.
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
Đầ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 );
Kiểm tra thông tin các cột của bảng prices vừa tạo:
\d prices
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 0 và price > 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 );
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
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);
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