Ràng buộc miền giá trị trong SQL

Ràng buộc (Constraint) là các quy tắc được áp dụng trên các cột dữ liệu của một bảng. Chúng được sử dụng để kiểm tra tính hợp lệ của dữ liệu đầu vào, đảm bảo tính chính xác, độ tin cậy và tính toàn vẹn của dữ liệu trong database.

Các constraint này có thể áp dụng trên một cột hay một table mà có mức độ ảnh hưởng khác nhau. Nếu chỉ áp dụng trên một cột thì cột đó bắt buộc phải đảm bảo thoả mãn các điều kiện được đinh nghĩa trong constraint, trong khi áp dụng ở mức table thì tất cả các cột phải thoả mãn.

Các loại ràng buộc phổ biến

Dưới đây là một số các ràng buộc phổ biến nhất được sử dụng trong SQL.

Ràng buộc Ý nghĩa
NOT NULL Đảm bảo giá trị của cột không được nhận giá trị NULL.
DEFAULT Cung cấp một giá trị mặc định khi dữ liệu của một cột NULL.
UNIQUE Đảm bảo rằng dữ liệu của cột là duy nhất, tất cả các giá trị trong một cột là khác nhau không trùng lặp.
PRIMARY Key Dùng để thiết lập khóa chính trên bảng, giá trị của cột làm khóa chính phải là duy nhất, không được trùng lặp. Việc khai báo ràng buộc khóa chính yêu cầu các cột phải NOT NULL.
FOREIGN Key Dùng để thiết lập khóa ngoại trên bảng, tham chiếu đến bảng khác thông qua giá trị của cột được liên kết. Giá trị của cột được liên kết phải là duy nhất trong bảng kia.
CHECK Đảm bảo tất cả các giá trị trong một cột thỏa mãn một số điều kiện.
INDEX Dùng để tạo và lấy dữ liệu từ cơ sở dữ liệu một cách nhanh chóng.

Các ràng buộc có thể được chỉ định khi bạn tạo bảng với câu lệnh CREATE TABLE hoặc sau khi tạo bảng với câu lệnh ALTER TABLE.

Not Null

Nếu chúng ta chỉ định một trường của một table phải Not Null. Thì dữ liệu của sẽ đảm bảo không bao giờ trả về null khi chúng ta truy vấn. Hơn nữa, bạn sẽ không được phép để trống giá trị của trường này khi thêm hay cập nhật dữ liệu.

Ví dụ, mã SQL bên dưới sẽ tạo một bảng Student với trường IDNAME Not Null. 

CREATE TABLE Student ( ID int(6) NOT NULL, NAME varchar(10) NOT NULL, ADDRESS varchar(20) );

UNIQUE

UNIQUE là ràng buộc trên giá trị duy nhất trên các cột, có nghĩa là các dòng dữ liệu không được có giá trị trùng nhau ở những cột đó đó. Ràng buộc này giống như khóa chính vậy, vì bản chất nó cũng là một khóa.

Ví dụ trong bảng SINHVIEN sẽ có MASINHVIEN là khóa chính, và cột CMND sẽ là UNIQUE. Thực ra bạn cũng có thể lấy CMND là khoa chính nhưng như vậy sẽ không hay lắm.

Cách này bạn sẽ đặt từ khóa UNIQUE ở cuối column muốn nó có giá trị không trùng lặp.

CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE );

Trường hợp này bạn đặt UNIQUE (column_list) ở cuối lệnh Create Table, nếu có nhiều cột thì cách nhau bởi dấu phẩy.

CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email) );

PRIMARY KEY

Primary key được dùng để đinh nghĩa các khoá chính trong một bảng. Khóa chính là một trường hoặc kết hợp nhiều trường và được xác định là một bản ghi duy nhất. Không trường nào trong khóa chính được chứa giá trị NULL. Một bảng chỉ có duy nhất một khóa chính. Khóa chính có thể được định nghĩa bằng lệnh CREATE TABLE hoặc lệnh ALTER TABLE.

CREATE TABLE Student ( ID int(6) NOT NULL UNIQUE, NAME varchar(10), ADDRESS varchar(20), PRIMARY KEY(ID) );

FOREIGN KEY

Dùng để thiết lập một khoá ngoại cho một bảng, những giá trị này phải đảm bảo tham chiếu đến một khoá chính trong một bảng khác.

CREATE TABLE Orders ( O_ID int NOT NULL, ORDER_NO int NOT NULL, C_ID int, PRIMARY KEY (O_ID), FOREIGN KEY (C_ID) REFERENCES Customers(C_ID) )

CHECK

Sử dụng Check Constraint chúng ta có thể chỉ định một điều kiện cho một trường cụ thể.

Ví dụ tạo một constraint cho trường AGE bắt buộc Not Null và phải có giá trị trên 18

CREATE TABLE Student ( ID int(6) NOT NULL, NAME varchar(10) NOT NULL, AGE int NOT NULL CHECK (AGE >= 18) );

DEFAULT

Constraint này được sử dụng để cung cấp giá trị mặc định cho một trường dữ liệu kho nó không được cung cấp tại thời điểm thêm hay cập nhật.

Ví dụ tạo constraint đảm bảo giá trị của AGE sẽ luôn là 18 khi nó không được cung cấp.

CREATE TABLE Student ( ID int(6) NOT NULL, NAME varchar(10) NOT NULL, AGE int DEFAULT 18 );

Xóa bỏ ràng buộc (Drop Constraint)

Bất kỳ ràng buộc nào đã định nghĩa đều có thể bị xóa bỏ bằng cách sử dụng lệnh ALTER TABLE với tùy chọn DROP CONSTRAINT.

Ví dụ, để xoá constraint khóa chính trong bảng EMPLOYEES, bạn có thể sử dụng lệnh sau đây.

ALTER TABLE EMPLOYEES DROP CONSTRAINT EMPLOYEES_PK;

Một số cơ sở dữ liệu có thể cung cấp các phím tắt để xoá các ràng buộc nhất một cách ngắn gọn hơn. Ví dụ, để loại bỏ ràng buộc khóa chính cho một bảng trong Oracle, bạn có thể sử dụng lệnh sau đây.

ALTER TABLE EMPLOYEES DROP PRIMARY KEY;

Ngoài ra có một số cơ sở dữ liệu cho phép vô hiệu hoá một constraint thay vì xoá chúng vĩnh viễn. Sẽ rất thích hợp khi bạn chỉ muốn ngắt nó đi tạm thời và sau đó lại kích hoạt nó hoạt động trở lại.

Nguồn tham khảo

//www.tutorialspoint.com/sql/sql-constraints.htm

//www.geeksforgeeks.org/sql-constraints/

Bài viết này mình sẽ chia sẽ một số kiến thức về cách định nghĩa ràng buộc trong MS SQL Server.

Constraint là gì?

Constraint là những quy tắc được áp dụng trên các cột dữ liệu, trên bảng. Được sử dụng để kiểm tra tính hợp lệ của dữ liệu vào, đảm bảo tính chính xác, tính toàn vẹn của dữ liệu.

Các loại constraint phổ biến

Loại ràng buộc Ý nghĩa
NOT NULL Sử dụng để đảm bảo dữ liệu của cột không được nhận giá trị NULL
DEFAULT Gán giá trị mặc định trong trường hợp dữ liệu của cột không được nhập vào hay không được xác định.
UNIQUE Sử dụng để đảm bảo dữ liệu của cột là duy nhất, không trùng lặp giá trị trên cùng 1 cột.
PRIMARY KEY (Khóa chính) Dùng để thiết lập khóa chính trên bảng, xác định giá trị trên tập các cột làm khóa chính phải là duy nhất, không được trùng lặp. Việc khai báo ràng buộc khóa chính yêu cầu các cột phải NOT NULL.
FOREIGN KEY (Khóa ngoại) Dùng để thiết lập khóa ngoại trên bảng, tham chiếu đến bảng khác thông qua giá trị của cột được liên kết. Giá trị của cột được liên kết phải là duy nhất trong bảng kia.
CHECK Bảo đảm tất cả giá trị trong cột thỏa mãn điều kiện nào đó. Đây là hình thức sử dụng phổ biến để kiểm tra tính hợp lệ của dữ liệu (validate data)

Một số lưu ý đối với ràng buộc CHECK:

  • Không thể định nghĩa trong VIEW
  • Các điều kiện thiết lập phải tham chiếu đến cột trong cùng 1 bảng dùng để khai báo ràng buộc, không thể tham chiếu tới các cột ở bảng khác. Trường hợp muốn tham chiếu đến bảng khác thì có thể dùng Function để trích xuất dữ liệu.
  • Không thể sử dụng subquery (truy vấn con) trong định nghĩa điều kiện
  • Chúng ta có thể khai báo ràng buộc trong câu lệnh CREATE TABLE (tạo mới bảng) hoặc ALTER TABLE (Sửa đổi bảng)

Ví dụ cụ thể

Cho bài toán quản lý Vay có thế chấp tài sản đơn giản thể hiện qua sơ đồ mức vật lý như sau:

1. Thiết lập ràng buộc NOT NULL trên cột MaKH của bảng KhachHang

  • Trường hợp tạo mới table:
CREATE TABLE KhachHang ( MaKH char(10) NOT NULL, HoTen nvarchar(50), DiaChi nvarchar(50), DienThoai varchar(50), NgaySinh date );
  • Trường hợp sửa đổi table:
ALTER TABLE KhachHang MODIFY MaKH char(10) NOT NULL;

2. Thiết lập ràng buộc DEFAULT cột NgayVay lấy giá trị mặc định là ngày hiện tại trong trường hợp ngày vay không được xác định. (Sử dụng function GETDATE() để lấy giá trị ngày hiện tại)

  • Trường hợp tạo mới table:
CREATE TABLE Vay ( MaVay char(10) NOT NULL, MaKH char(10) NOT NULL, MaTaiSan char(10) NOT NULL, MaNV char(10) NOT NULL, NgayVay date DEFAULT GETDATE(), ThoiHan int, LaiSuat float, SoTienVay money, NgayHetHan date );
  • Trường hợp sửa đổi table:
ALTER TABLE Vay ADD CONSTRAINT df_ngay_vay DEFAULT GETDATE() FOR NgayVay;

3. Thiết lập ràng buộc PRIMARY KEY (khóa chính) cho cột MaTaiSan trên table TaiSan

  • Trường hợp tạo mới table:

Cách 1: định nghĩa trực tiếp khi khai báo cột, không khai báo constraint

CREATE TABLE TaiSan ( MaTaiSan char(10) PRIMARY KEY, TenTaiSan nvarchar(70) NOT NULL, LoaiTaiSan nvarchar(30), GiaTri money );

Cách 2: Định nghĩa constraint

CREATE TABLE TaiSan ( MaTaiSan char(10) NOT NULL, CONSTRAINT pk_ma_ts PRIMARY KEY (MaTaiSan), TenTaiSan nvarchar(70) NOT NULL, LoaiTaiSan nvarchar(30), GiaTri money );
  • Trường hợp sửa đổi table:
ALTER TABLE TaiSan ADD CONSTRAINT pk_mats PRIMARY KEY (MaTaiSan);

4. Thiết lập ràng buộc FOREIGN KEY (khóa ngoại) cho cột MaKH trên table Vay

  • Trường hợp tạo mới table:

Cách 1: định nghĩa trực tiếp khi khai báo cột, không khai báo constraint

CREATE TABLE Vay ( MaVay char(10) NOT NULL, MaKH char(10) FOREIGN KEY REFERENCES KhachHang(MaKH), MaTaiSan char(10), MaNV char(10), NgayVay date, ThoiHan int, LaiSuat float, SoTienVay money, NgayHetHan date );

Cách 2: Định nghĩa constraint

CREATE TABLE Vay ( MaVay char(10) NOT NULL, MaKH char(10), CONSTRAINT FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH), MaTaiSan char(10), MaNV char(10), NgayVay date, ThoiHan int, LaiSuat float, SoTienVay money, NgayHetHan date );
  • Trường hợp sửa đổi table:
ALTER TABLE Vay ADD CONSTRAINT fk_makh FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH);

5. Tạo ràng buộc UNIQUE (duy nhất) trên trường DienThoai của Bảng KhachHang

  • Trường hợp tạo mới table:

Cách 1:

CREATE TABLE KhachHang ( MaKH char(10) NOT NULL, HoTen nvarchar(50) NOT NULL, DiaChi nvarchar(50) NOT NULL, DienThoai varchar(50) UNIQUE, NgaySinh date );

Cách 2:

CREATE TABLE KhachHang ( MaKH char(10) NOT NULL, HoTen nvarchar(50) NOT NULL, DiaChi nvarchar(50) NOT NULL, DienThoai varchar(50), CONSTRAINT unique_dien_thoai UNIQUE (DienThoai) NgaySinh date );
  • Trường hợp sửa đổi table:
ALTER TABLE KhachHang ADD CONSTRAINT unique_dien_thoai UNIQUE (DienThoai);

Lưu ý:

Nên sử dụng Cách 2 trong ở trên mình đưa ra, hay chính là việc chúng ta nên sử dụng kiểu khai báo có đặt tên ràng buộc thông qua khai báo bằng lệnh CONSTRAINT. Vì với cách này bạn sẽ dễ dàng xóa bỏ, sửa đổi, bỏ kích hoạt, kích hoạt vì nó xác định qua tên của ràng buộc

6. Ví dụ một số ràng buộc CHECK

  • Tạo ràng buộc check trên trường NgayVaoLam > ‘1/1/1995’ của bảng NhanVien.
ALTER TABLE NhanVien ADD CONSTRAINT check_ngay_vao_lam CHECK (NgayVaoLam > '1995-1-1');
  • Tạo ràng buộc check trên trường NgayHetHan phải lớn hơn NgayVay của bảng Vay
ALTER TABLE Vay ADD CONSTRAINT check_ngayhethan CHECK (NgayHetHan > NgayVay);
  • Tạo ràng buộc kiểm tra trên trường GiaTri>=0 của bảng TaiSan
ALTER TABLE TaiSan ADD CONSTRAINT check_gia_tri CHECK (GiaTri > 0);
  • Tạo ràng buộc kiểm tra trên trường ThoiHan nằm trong khoảng 1 đến 36 tháng của bảng Vay
ALTER TABLE Vay ADD CONSTRAINT check_thoi_han CHECK (ThoiHan BETWEEN 1 AND 36);

Xóa bỏ constraint

Cú pháp xóa bỏ:

ALTER TABLE <tên table chứa ràng buộc> DROP CONSTRAINT <tên ràng buộc muốn xóa bỏ>

Ví dụ: Xóa bỏ ràng buộc check_ngay_vao_lam trong table NhanVien đã khai báo ở mục 6.

ALTER TABLE NhanVien DROP CONSTRAINT check_ngay_vao_lam

Bỏ kích hoạt và kích hoạt constraint

Đôi khi bạn muốn bỏ việc check ràng buộc trong một số trường hợp nhưng lại không muốn xóa bỏ đi ràng buộc đã khai báo. Trường hợp này chúng ta có thể chọn tính năng bỏ kích hoạt. Cú pháp bỏ kích hoạt:

ALTER TABLE <tên table chứa ràng buộc> NOCHECK CONSTRAINT <tên ràng buộc>

Ví dụ: Vô hiệu hóa ràng buộc kiểm tra trên trường ThoiHan nằm trong khoảng 1 đến 36 tháng của bảng Vay

ALTER TABLE Vay NOCHECK CONSTRAINT check_ngayhethan

Trường hợp muốn kích hoạt lại ràng buộc, chúng ta sử dụng cú pháp sau:

ALTER TABLE <tên table chứa ràng buộc> WITH CHECK CHECK CONSTRAINT <tên ràng buộc>

Ví dụ: Vô hiệu hóa ràng buộc kiểm tra trên trường ThoiHan nằm trong khoảng 1 đến 36 tháng của bảng Vay

ALTER TABLE Vay WITH CHECK CHECK CONSTRAINT check_ngayhethan

Kết luận

Trên đây là những gì mình tổng hợp và tự đưa ra ví dụ minh họa cho từng phần. Hi vọng sẽ giúp ích cho các bạn trong quá trình sử dụng constraint trong câu lệnh sql.

Video liên quan

Chủ đề