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