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

[sửa | sửa mã nguồn]

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

[sửa | sửa mã nguồn]

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.

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ “Unique constraints and check constraints - SQL Server”. Microsoft Learn (bằng tiếng Anh). 2 tháng 1 năm 2024. Lưu trữ bản gốc ngày 10 tháng 1 năm 2025. Truy cập ngày 10 tháng 1 năm 2025.
  2. ^ Đỗ Trung Tuấn (2007). Cơ sở dữ liệu. Nhà xuất bản Đại học Quốc gia Hà Nội. tr. 148. Đ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 [...]
  3. ^ “5.4. Constraints”. PostgreSQL Documentation (bằng tiếng Anh). 21 tháng 11 năm 2024. Truy cập ngày 10 tháng 1 năm 2025.
Chúng tôi bán
Bài viết liên quan
Giới thiệu bộ kỹ năng của Childe trong Genshin Impact
Giới thiệu bộ kỹ năng của Childe trong Genshin Impact
Theo như bản cập nhật 1.1 sắp tới chúng ta sẽ những kỹ năng buff team cực kì mạnh từ Childe
Quân đội Israel - Nguồn Gốc và Sức Mạnh
Quân đội Israel - Nguồn Gốc và Sức Mạnh
Đây là lời tuyên chiến đầu tiên của Israel kể từ năm 1973, tỏ rõ ý định muốn chơi tới cùng với Hamas và chắc chắn sẽ giành được chiến thắng chung cuộc.
Nhân vật Tokitou Muichirou - Kimetsu no Yaiba
Nhân vật Tokitou Muichirou - Kimetsu no Yaiba
Tokito Muichiro「時透 無一郎 Tokitō Muichirō​​」là Hà Trụ của Sát Quỷ Đội. Cậu là hậu duệ của Thượng Huyền Nhất Kokushibou và vị kiếm sĩ huyền thoại Tsugikuni Yoriichi.
Các loại phô mai ngon nhất chinh phục được cả thế giới
Các loại phô mai ngon nhất chinh phục được cả thế giới
Phô mai là thực phẩm phổ biến ở phương Tây. Ngày nay, phô mai được sử dụng rộng rãi trên thế giới kể cả tại Việt Nam