Các loại ràng buộc trong SQL Server

Để hiểu hơn về SQL server chúng ta cần phải hiểu về các loại ràng buộc, vậy hãy cùng nhau tìm hiểu bài viết sau đây.

Mục lục

    1. Ràng buộc CHECK

    Ràng buộc CHECK được sử dụng nhằm chỉ định điều kiện hợp lệ đối với dữ liệu. Mỗi khi có sự thay đổi dữ liệu trên bảng (INSERT, UPDATE), những ràng buộc này sẽ  được sử dụng nhằm kiểm tra xem dữ liệu mới có hợp lệ hay không.

    Ràng buộc CHECK được khai báo theo cú pháp như sau:

    [CONSTRAINT tên_ràng_buộc] CHECK (điều_kiện) Ví dụ:

    create table students
    ( studentid int identity(1,1) primary key, studentname nvarchar(50) not null, address nvarchar(100) not null, score1 tinyint not null constraint chk_score1 CHECK (score1 >= 0 and score1 <= 10), score2 tinyint not null constraint chk_score2 CHECK (score2 between 0 and 10), score3 tinyint not null constraint chk_score3 CHECK (score3 in (1,2,3,4,5,6,7,8,9,10)),
    )

    Thực hiện việc thêm một dòng có dữ liệu không thỏa điều kiện

    insert into students
    values('Nguyen Van Dung', '12 Tran Quang Khai', 10, 10, -2)

    Các loại ràng buộc trong SQL Server

    Có thể gộp chung các ràng buộc CHECK lại trong một ràng buộc duy nhất như sau

    create table students
    ( studentid int identity(1,1) primary key, studentname nvarchar(50) not null, address nvarchar(100) not null, score1 tinyint not null , score2 tinyint not null,
    score3 tinyint not null, constraint chk_score  CHECK( ( score1>= 0 and score 1 <=10) and (score2 between 0 and 10) and (score3 in (1 ,2,3,4,5,6,7, 8,9,10)))
    )

    2. Ràng buộc PRIMARY KEY

    Ràng buộc PRIMARY KEY được sử dụng để định nghĩa khoá chính của bảng. Khoá chính của một bảng là một hoặc một tập nhiều cột mà giá trị của chúng là duy nhất  trong bảng.  Hay  nói  cách  khác,  giá  trị  của  khoá  chính  sẽ  giúp  cho  ta  xác  định được duy nhất một dòng (bản ghi) trong bảng dữ liệu. Mỗi một bảng chỉ có thể có duy nhất  một  khoá  chính và  bản  thân  khoá  chính  không  chấp  nhận  giá  trị  NULL.  R àng buộc PRIMARY KEY là cơ sở cho việc đảm bảo tính toàn vẹn thực thể cũng như toàn vẹn tham chiếu.

    Để khai báo một ràng buộc PRIMARY KEY, ta sử dụng cú pháp nh ư sau:

    [CONSTRAINT tên_ràng_buộc] PRIMARY KEY [(danh_sách_cột)]

    Nếu khoá chính của bảng chỉ bao gồm đúng một cột v à ràng buộc PRIMARY KEY được chỉ định ở mức cột, ta không cần thiết phải chỉ định danh sách cột sau từ khoá PRIMARY KEY. Tuy nhiên, nếu việc khai báo khoá chính được tiến hành ở mức bảng (sử dụng khi số lượng các cột tham gia vào khoá là từ hai trở lên) thì bắt buộc phải chỉ định danh sách cột ngay sau từ khóa PRIMARY KEY và tên các cột được phân cách nhau bởi dấu phẩy. Ví dụ 1: Định nghĩa một bảng chỉ có một khóa chính

    create table customers
    ( customerid int identity(1,2) constraint chk_primarykey primary key, customername nvarchar(50) not null, address nvarchar(100) not null, gender bit not null
    )

    Hoặc là

    create table customers
    ( customerid int identity(1,2) primary key, customername nvarchar(50) not null, address nvarchar(100) not null, gender bit not null
    )

    Ví dụ 2: Định nghĩa bảng có hai khóa chính:

    create table orderdetail
    ( customerid int, orderid int, itemid int not null, quantity decimal(8,2) not null, constraint chk_primarykey primary key (customerid, orderid)
    )

    3. Ràng buộc FOREIGN KEY

    FOREIGN KEY là một cột hay một sự kết hợp của nhiều cột được sử dụng để áp đặt mối liên kết dữ liệu giữa hai table. FOREIGN KEY của một bảng sẽ giữ giá trị của PRIMARY KEY của một bảng khác và chúng ta có thể tạo ra nhiều FOREIGN KEY trong một table.

    FOREIGN KEY có thể tham chiếu vào PRIMARY KEY hay cột có ràng buộc duy nhất.

    FOREIGN KEY có thể chứa giá trị NULL. Mặc dù mục đích chính của ràng buộc FOREIGN KEY là để kiểm soát dữ liệu chứa trong bảng có FOREIGN KEY (tức table con) nhưng thực chất nó cũng kiểm soát luôn cả dữ liệu trong bảng chứa PRIMARY KEY (tức table cha). Ví dụ nếu ta xóa dữ liệu trong bảng cha thì dữ liệu trong bảng con trở nên “mồ côi” (orphan) vì không thể tham chiếu ngược về bảng cha. Do đó ràng buộc FOREIGN KEY sẽ đảm bảo điều đó không xảy ra. Nếu bạn muốn xóa dữ liệu trong bảng cha thì trước hết bạn phải xóa hay vô hiệu hóa ràng buộc FOREIGN KEY trong bảng con trước.

    Ràng buộc FOREIGN KEY được định nghĩa theo cú pháp dưới đây:

    [CONSTRAINT tên_ràng_buộc] FOREIGN KEY [(danh_sách_cột)]
    REFERENCES tên_bảng_tham_chiếu(danh_sách_cột_tham_chiếu)
    [ ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT ]
    [ ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT ]

    Việc định nghĩa một ràng buộc FOREIGN KEY bao gồm các yếu tố sau:

    Tên  cột  hoặc  danh  sách  cột  của  bảng  được  định  nghĩa tham  gia  vào  khoá ngoài.

    Tên của bảng được tham chiếu bởi khoá ngoài và danh sách các cột được tham chiếu đến trong bảng tham chiếu.

    Cách thức xử lý đối với các bản ghi trong bảng đ ược định nghĩa trong trường hợp các bản  ghi  được  tham  chiếu  trong  bảng  tham  chiếu  bị  xoá  (ON DELETE) hay cập nhật (ON

    UPDATE). SQL chuẩn đưa ra 4 cách xử lý

    CASCADE: Tự động xoá (cập nhật) nếu bản ghi được tham chiếu bị xoá (cập nhật).

    NO  ACTION:  (Mặc  định)  Nếu  bản  ghi  trong  bảng  tham  chiếu đang  được  tham chiếu  bởi  một  bản  ghi  bất  kỳ  trong  bảng  đ ược định nghĩa thì bàn ghi đó không được phép xoá hoặc cập nhật (đối với cột được tham chiếu).

    SET  NULL:  Cập  nhật  lại  khoá  ngoài  của  bản  ghi  thành  giá  trị NULL (nếu cột cho phép nhận giá trị NULL).

    SET DEFAULT: Cập nhật lại khoá ngoài của bản ghi nhận giá trị mặc định (nếu cột có qui định giá trị mặc định).

    Ví dụ:

    drop table orderdetail create table orderdetail
    ( orderid int constraint fk_orderdetail_orders foreign key references orders(orderid) on delete cascade on update cascade, customerid int constraint fk_orderdetail_customer foreign key references customers(customerid) on delete cascade on update cascade, itemid int
    constraint fk_orderdetail_items foreign key references items(itemid) on delete cascade on update cascade, quantity decimal(18,2) not null,
    )