Ràng buộc kiểm tra

**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  thì ràng buộc bị vi phạm và thành  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. Đ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 (SQL)|SELECT]]` hoặc `[[Update (SQL)|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. 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.

## Khai báo
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:

```sql
CREATE TABLE ten_bang (
    ...
    ten_cot kieu_du_lieu CHECK ( <vị từ> ),
    ...
)
```



```sql
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.

```sql
ALTER TABLE ten_bang
   ADD CONSTRAINT ten_rang_buoc CHECK ( <vị từ> )
```

## Ràng buộc NOT NULL
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.

## Hạn chế chung
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:

* 
* 
* 

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.

## Tham khảo