Ràng buộc kiểm tra (hay ràng buộc CHECK) là một loại ràng buộc tính toàn vẹn trong SQL, ràng buộc này chỉ rõ những yêu cầu mà mỗi hàng trong một bảng của cơ sở dữ liệu phải đáp ứng. Ràng buộc phải là một vị từ, tức là một biểu thức hoặc điều kiện trả về kết quả cụ thể. Nó có thể tham chiếu đến một hoặc nhiều cột của bảng. Kết quả của vị từ có thể là TRUE
, FALSE
hoặc UNKNOWN
(nếu có giá trị NULL). Khi vị từ được đánh giá thành FALSE
thì ràng buộc bị vi phạm và thành TRUE
thì không bị vi phạm. Nếu vị từ được đánh giá thành UNKNOWN
, thì ràng buộc sẽ không bị vi phạm và hàng đó có thể được chèn hoặc cập nhật vào trong bảng.[1] Điều này trái ngược với các vị từ trong mệnh đề WHERE
xuất hiện trong các câu lệnh SELECT
hoặc UPDATE
.
Ví dụ, trong một bảng về sản phẩm, người ta có thể thêm một ràng buộc kiểm tra để ràng buộc giá cả và số lượng của một sản phẩm là một giá trị không âm:
gia >= 0
soluong >= 0
Nếu không có những ràng buộc này, giá cả có thể bị âm (−100000 ₫) và số lượng cũng có thể bị âm (−3 sản phẩm).
Ràng buộc kiểm tra được dùng để đảm bảo tính hợp lệ của dữ liệu trong cơ sở dữ liệu và để cung cấp sự toàn vẹn dữ liệu.[2] Nếu các ràng buộc này được sử dụng ở cấp độ cơ sở dữ liệu, các ứng dụng sử dụng cơ sở dữ liệu sẽ không thể thêm dữ liệu không hợp lệ hoặc sửa đổi dữ liệu từ hợp lệ thành không hợp lệ, kể cả khi bản thân ứng dụng đó coi dữ liệu đó là hợp lệ hay không.
Mỗi ràng buộc kiểm tra phải được khai báo bằng câu lệnh CREATE TABLE
hoặc ALTER TABLE
với cú pháp sau:
CREATE TABLE ten_bang (
...
ten_cot kieu_du_lieu CHECK ( <vị từ> ),
...
)
CREATE TABLE ten_bang (
...,
CONSTRAINT ten_rang_buoc CHECK ( <vị từ> ),
...
)
Nếu ràng buộc kiểm tra chỉ ảnh hưởng đến một cột duy nhất, nó có thể được khai báo trực tiếp trong phần khai báo cột.
ALTER TABLE ten_bang
ADD CONSTRAINT ten_rang_buoc CHECK ( <vị từ> )
Ràng buộc NOT NULL
tương đương về mặt chức năng với ràng buộc kiểm tra có sử dụng vị từ IS NOT NULL
như sau:
CHECK (cot IS NOT NULL)
Một số hệ quản trị cơ sở dữ liệu quan hệ, chẳng hạn như PostgreSQL, có thể tối ưu hóa hiệu năng nếu như dùng cú pháp NOT NULL
thay vì sử dụng cú pháp CHECK
ở trên.[3]
Hầu hết các hệ quản lý cơ sở dữ liệu chỉ cho phép ràng buộc kiểm tra đối với một hàng duy nhất. Các ràng buộc này được truy cập vào các hằng và các hàm tất định (deterministic), nhưng không được truy cập vào dữ liệu trong các bảng khác hoặc dữ liệu nằm ngoài tầm của giao tác (transaction) hiện tại do tính cô lập của giao tác.
Những ràng buộc như vậy không hẳn là ràng buộc kiểm tra bảng mà chỉ là ràng buộc kiểm tra hàng. Vì những ràng buộc này thường chỉ được xác minh sau khi một hàng được cập nhật trực tiếp (vì lý do hiệu năng) và thường được cài đặt dưới dạng các bộ kích hoạt (trigger) INSERT
hoặc UPDATE
ngầm định, nên các ràng buộc toàn vẹn có thể bị các hành động gián tiếp làm vi phạm nếu không có những hạn chế này. Hơn nữa, những sửa đổi hợp lệ đối với các bản ghi này sau đó sẽ bị ràng buộc CHECK
này cản lại. Một số ví dụ về những ràng buộc nguy hiểm bao gồm:
CHECK ((select count(*) from HoaDon where HoaDon.MaKH = MaKhachHang) < 1000)
CHECK (dateInserted = CURRENT_DATE)
CHECK (countItems = RAND())
Có thể sử dụng các bộ kích hoạt do người dùng định nghĩa để khắc phục những hạn chế này. Mặc dù giống nhau về cách cài đặt, nhưng về mặt ngữ nghĩa thì rõ ràng rằng các bộ kích hoạt sẽ chỉ được kích hoạt khi bảng được sửa đổi trực tiếp. Khi đó, người thiết kế cơ sở dữ liệu có trách nhiệm xử lý các thay đổi quan trọng, gián tiếp trong các bảng khác. Mặt khác, các ràng buộc được thiết kế sao cho nó "luôn đúng", bất kể là do người thiết kế không lường trước hay là do hành động của người dùng.
Điều kiện toàn vẹn dữ liệu trong quan hệ có thể được thể hiện qua câu lệnh CHECK. Câu lệnh này cho phép hạn chế tập các giá trị đối với cột [...]