SQL Server – Constraints | ManhDan Blogs

Trong một CSDL, luôn luôn tồn tại rất nhiều mối liên hệ ảnh hưởng qua lại lẫn nhau giữa các thuộc tính của một quan hệ, giữa các bộ giá trị trong một quan hệ và giữa các thuộc tính của các bộ giá trị trong các quan hệ với nhau. Các mối quan hệ phụ thuộc lần nhau này chính là điều kiện bất biến mà tất cả các bộ của những quan hệ có liên quan trong cơ sở dữ liệu đều phải thỏa mãn ở bất kì thời điểm nào. Ràng buộc toàn vẹn còn được gọi là các quy tắc quản lý (Rules) được áp đặt lên trên các đối tượng của thế giới thực. Như vậy, ràng buộc toàn vẹn (RBTV) là một điều kiện bất biến không được vi phạm trong một CSDL, RBTV được xác định khi định nghĩa lược đồ CSDL, đồng thời khi các quan hệ có sự thay đổi, cập nhật dữ liệu thông qua các thao tác insert, update,v…, các RBTV sẽ được kiểm tra.

Ràng buộc NOT NULL 

Khi khai báo ràng buộc NOT NULL trong định nghĩa của thuộc tính thì ta bắt buộc thuộc tính này phải có giá trị. Nếu bạn không chỉ thị trong định nghĩa của thuộc tính thì nó có thể có hoặc không có giá trị.

Tạo ràng buộc khi tạo bảng mới

Cú pháp:

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE CONSTRAINT
)

Ví dụ: Tạo ràng buộc NOT NULL cho cột tên nhân viên trong bảng nhân viên

CREATE TABLE NHANVIEN
(
    TENNV NVARCHAR(20) NOT NULL
)

Tạo ràng buộc khi bảng đã tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD COLUMN_NAME DATATYPE CONSTRAINT

Ví dụ: Tạo ràng buộc NOT NULL cho cột tên nhân viên trong bảng nhân viên (bảng nhân viên đã tồn tại)

ALTER TABLE NHANVIEN
ADD HONV NVARCHAR(20) NOT NULL

Ràng buộc DEFAULT

Ràng buộc default được cài đặt trong trường hợp bạn muốn gán một giá trị mặc định tự động cho một thuộc tính khi người dùng không nhập dữ liệu.

Tạo ràng buộc khi tạo mới bảng

Cú pháp:

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE DEFAULT value|function
)

Ví dụ: Hãy ràng buộc cho cột lương có giá trị mặc định là 2000

CREATE TABLE NHANVIEN
(
    LUONG INT DEFAULT 2000
)

Tạo ràng buộc khi bảng đã tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD CONSTRAINT CONSTRAINT_NAME DEFAULT value|function FOR COLUMN_NAME

Ví dụ: Hãy ràng buộc cho cột lương có giá trị mặc định là 2000

ALTER TABLE NHANVIEN
ADD CONSTRAINT DF_LUONG DEFAULT 2000 FOR LUONG

Ràng buộc CHECK

Ràng buộc check được sử dụng để ràng buộc các giá trị trong cột phải thỏa mãn điều kiện hoặc quy tắc theo định nghĩa.

Tạo ràng buộc khi tạo bảng mới

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE [DEFAULT|...],
    [,...N]
    [CONSTRAINT NAME] CHECK(expression)
)

Ví dụ: Hãy ràng buộc cho cột lương trong bảng nhân viên có giá trị nhỏ hơn 8000

CREATE TABLE NHANVIEN
(
    MANV VARCHAR(20) NOT NULL,
    LUONG INT DEFAULT 2000,
    CONSTRAINT CK_LUONG CHECK(LUONG < 8000)
)

Tạo ràng buộc khi bảng tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD [CONSTRAINT NAME] CHECK(expression)

Ví dụ: Hãy tạo ràng buộc cho cột lương có giá trị nhỏ hơn 8000

ALTER TABLE NHANVIEN
ADD CONSTRAINT CT_LUONG CHECK(LUONG < 8000)

Ràng buộc RULE

Rule cũng được sử dụng để cài đặt, định nghĩa một RBTV miền giá trị, tuy nhiên khác với CHECK vốn trình bày trực tiếp nội dung của RBTV trên một quan hệ, RULE lại chỉ ra một quy tắc trên một miền giá trị, quy tắc sao đó sẽ được áp dụng cụ thể vào một hoặc nhiều quan hệ. Ưu điểm của RULE so với CHECK trong trường hợp cài đặt RBTV miền giá trị là khi có sự thay đổi về nội dung của RBTV, nếu như cài đặt bằng CHECK ta phải chỉnh sửa lại tất cả các quan hệ ta đã cài đặt đặt RBTV thì đối với RULE, ta chỉ thay đổi nội dung của RULE, các quan hệ áp dụng quy tắc của RULE đó sẽ tự động cập nhật sự thay đổi này. Một điểm khác biệt nữa giữa CHECK và RULE đó chính là CHECK bản thân là một đối tượng CONSTRAINT tồn tại trong một bảng của database, trong khi đó RULE là một đối tượng của database.

Quy trình để cài đặt và thực hiện RULE gồm 3 bước:

Bước 1: Định nghĩa đối tượng RULE

Cú pháp:

CREATE RULE RULE_NAME
AS
    <EXPRESSION>

Bước 2: Áp dụng RULE cho các cột  trên các quan hệ.

EXEC SP_BINDRULE RULE_NAME, TABLE_NAME.COLUMN_NAME

Ví dụ: Cài đặt ràng buộc miền giá trị “lương của một nhân viên phải ít hơn 8000”

Bước 1: Định nghĩa RULE

CREATE RULE RANGE_LUONG
AS
    @range < 8000

Bước 2: Thực hiện RULE

EXEC SP_BINDRULE RANGE_LUONG, 'NHANVIEN.LUONG'

Ràng buộc UNIQUE

Ràng buộc Unique đùng để đảm bảo không có giá trị trùng ở các cột. Mặc dù Unique và Primary Key đều tuân thủ theo quy tắc là duy nhất, nhưng hãy sử dụng Unique khi bạn muốn đảm nhận tính duy nhất của:

+ Một cột, hay sự kết hợp giữa các cột mà không phải là khóa chính.

+ Một cột chấp giá đầu vào là giá trị NULL, trong khi đó Primary Key không chấp nhận điều này.

+ Một bảng có thể có nhiều cột muốn giá trị là duy nhất.

Tạo ràng buộc khi tạo mới

Cú pháp:

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE [NOT NULL|...],
    [,...N]
    [CONSTRAINT NAME] UNIQUE (COLUMN_NAME)
)

Ví dụ: Hãy tạo ràng buộc tên phòng là duy nhất trong bảng phòng ban

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10) NOT NULL,
    TENPHG VARCHAR(30) UNIQUE
)

Hoặc

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10) NOT NULL,
    TENPHG VARCHAR(30),
    CONSTRAINT UQ_TENPHG UNIQUE(TENPHG)
)

Tạo ràng buộc khi bảng đã tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD [CONSTRAINT NAME] UNIQUE (COLUMN_NAME)

Ví dụ: Hãy tạo ràng buộc tên phòng là duy nhất trong bảng phòng ban

ALTER TABLE PHONGBAN
ADD CONSTRAINT CT_TENPHG UNIQUE (TENPHG)

Ràng buộc khóa chính (PRIMARY KEY)

Một quan hệ thường có một hay nhiều thuộc tính có giá trị riêng để nhận biết hai bộ bất kỳ trong cùng một quan hệ. Các thuộc tính này được gọi khóa chính (Primary Key) của quan hệ và đảm bảo tính toàn vẹn thực thể trong quan hệ đó.

Tạo ràng buộc khi tạo mới bảng

Cú pháp:

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE [NOT NULL|...],
    [,...N]
    [CONSTRAINT NAME] PRIMARY KEY (COLUMN_NAME)
)

Ví dụ: Hãy tạo ràng buộc khóa chính cho thuộc tính mã phòng trong bảng phòng ban

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10) PRIMARY KEY,
    TENPHG VARCHAR(30),
)

Hoặc

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10),
    TENPHG VARCHAR(30),
    CONSTRAINT PK_MAPHG PRIMARY KEY (TENPHG)
)

Tạo ràng buộc khi bảng đã tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD [CONSTRAINT PK_NAME] PRIMARY KEY (COLUMN_NAME)

Ví dụ: Hãy tạo ràng buộc khóa chính cho thuộc tính mã phòng trong bảng phòng ban

ALTER TABLE PHONGBAN
ADD CONSTRAINT PK_MAPB PRIMARY KEY (MAPB)

Ràng buộc khóa ngoại (FOREIGN KEY)

Chỉ ra mối quan hệ ràng buộc tham chiếu giữa bảng này với bảng khác. Từ khóa ON DELETE CASCADE được chỉ định trong dạng khóa này để khi dữ liệu cha bị xóa thì dữ liệu con cũng tự động bị xóa theo.

Tạo ràng buộc khi tạo mới bảng

Cú pháp:

CREATE TABLE TABLE_NAME
(
    COLUMN_NAME DATATYPE [NOT NULL|...],
    [,...N]
    [CONSTRAINT FK_NAME] FOREIGN KEY (COLUMN_NAME_1) REFERENCES TABLE_NAME (COLUMN_NAME_2)
)

Trong đó:

+ PK_NAME: tên khóa ngoại.

+ COLUMN_NAME_1: thuộc tính được chọn làm khóa ngoại.

+ TABLE_NAME: tên bảng tham chiếu (bảng chứa khóa chính)

+ COLUMN_NAME_2: thuộc tính trong bảng chứa khóa chính được tham chiếu.

Ví dụ: Hãy tạo ràng buộc cho thuộc tính PHONG trong bảng NHANVIEN

Tên bảng
Thuộc tính

NHANVIEN

MANV

, HONV, TENLOT, TENNV, NGSINH, DIACHI, LUONG, PHAI, MA_NQL, PHONG

PHONG

MAPB

, TENPB,TRG_PHG, NGAY, NGAY_NHAMCHUC

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10) PRIMARY KEY,
    TENPB NVARCHAR(40),
    ...
)

CREATE TABLE NHANVIEN
(
    MANV VARCHAR(10) PRIMARY KEY,
    HONV NVARCHAR(40),
    PHONG VARCHAR(10),
    ...
    CONSTRAINT FK_PHONG FOREIGN KEY (PHONG) REFERENCES PHONGBAN (MAPB)
)

Tạo ràng buộc khi bảng đã tồn tại

Cú pháp:

ALTER TABLE TABLE_NAME
ADD [CONSTRAINT PK_NAME] FOREIGN KEY (COLUMN_NAME_1) REFERENCES TABLE_NAME (COLUMN_NAME_2)

Ví dụ: Hãy tạo ràng buộc khóa ngoại cho thuộc tính PHONG trong bảng NHANVIEN

CREATE TABLE PHONGBAN
(
    MAPB VARCHAR(10) PRIMARY KEY,
    TENPB NVARCHAR(40),
    ...
)

CREATE TABLE NHANVIEN
(
    MANV NVARCHAR(10) PRIMARY KEY,
    HONV NVARCHAR(40),
    PHONG VARCHAR(10),
    ...
)

ALTER TABLE NHANVIEN
ADD CONSTRAINT FK_PHONG FOREIGN KEY (PHONG) REFERENCES PHONGBAN (MAPB)

Xóa bỏ ràng buộc

Cú pháp:

ALTER TABLE TABLE_NAME
DROP CONSTRAINT <CONSTRAINT_NAME>

Ví dụ: Hãy xóa bỏ ràng buộc khóa ngoại PHONG ở bảng NHANVIEN

ALTER TABLE NHANVIEN
DROP CONSTRAINT FK_PHONG

Xóa bỏ một RULE ra khỏi quan hệ

Cú pháp:

EXEC SP_UNBINDRULE TABLE_NAME.COLUMN_NAME

Ví dụ: Hãy bỏ ràng buộc rule của thuộc tính LUONG ở bảng NHANVIEN

EXEC SP_UNBINDRULE 'NHANVIEN.LUONG'

Xóa bỏ một RULE

Cú pháp:

DROP RULE RULE_NAME

Ví dụ: Hãy xóa rule RANGE_LUONG

DROP RULE RANGE_LUONG