Constraint (ràng buộc) table strong SQL Server
- 23-05-2022
- Toanngo92
- 0 Comments
Mục lục
Giới thiệu Constraints (ràng buộc)
Một trong những chức năng quan trọng trong SQL Server là duy trì và thực thi tính toàn vẹn của dữ liệu. Có một số phương tiện để đạt được điều này, nhưng một trong những phương pháp thường được sử dụng và ưa thích là sử dụng các ràng buộc. Ràng buộc là một thuộc tính được gán cho một cột hoặc tập hợp các cột trong bảng để ngăn một số loại giá trị dữ liệu không nhất quán được nhập vào. Các ràng buộc được sử dụng để áp dụng các quy tắc logic nghiệp vụ và thực thi tính toàn vẹn của dữ liệu.
Ràng buộc (constraint) có thể được tạo khi bảng được tạo, là một phần của định nghĩa bảng, có thể được đưa vào bảng trong khi tạo hoặc đưa vào sau khi tạo.Ràng buộc có thể được phân loại là ràng buộc cột và ràng buộc bảng:
- Ràng buộc bảng: Có thể áp dụng cho nhiều cột trong bảng và được khai báo độc lập với định nghĩa cột. Ràng buộc bảng phải được sử dụng khi có nhiều hơn một cột trong một ràng buộc
- Ràng buộc cột: Được phát biểu như một phần của định nghĩa cột và chỉ áp dụng cho cột đó.
Các loại ràng buộc trong SQL Server:
- PRIMARY KEY
- UNIQUE
- FOREIGN KEY
- CHECK
- NOT NULL
PRIMARY KEY (Khóa chính)
một bảng thường có khóa chính bao gồm một cột duy nhất hoặc kết hợp các cột để xác định duy nhất từng hàng trong bảng. Ràng buộc PRIMARY KEY được sử dụng để tạo khóa chính nhằm mục đích đảm bảo tính toàn vẹn của thực thể trong bảng.
Lưu ý: Trong 1 bảng, chỉ được tạo một PRIMARY KEY duy nhất.
Hai hàng trong bảng không được có cùng giá trị khóa chính và cột là khóa chính không được phép có giá trị NULL. Do đó, khi một ràng buộc khóa chính được thêm vào các cột hiện có của bảng, SQL Server sẽ kiểm tra xem các quy tắc cho khóa chính có được tuân thủ hay không. Nếu các cột hiện có không tuân thủ các quy tắc của khóa chính thì ràng buộc sẽ không được thêm vào và sẽ báo lỗi trả ra.
Cú pháp thêm khóa chính vào cột trong khi thêm bảng:
CREATE TABLE <table_name> (Column_Name datatype PRIMARY KEY [,column_list])
Ví dụ:
create database empDB
GO
use empDB
GO
create table EmpContactPhone (Employee_ID int primary key, MobileNumber bigint, serviceProvider varchar(30), LandlineNumber bigint)
Sau khi chạy lệnh thành công, database empDB được tạo với cột Employee_ID là khóa chính:
Cú pháp thêm khóa chính vào cột khi sửa bảng:
ALTER TABLE <table_name> ADD PRIMARY KEY (<column_name>)
Ví dụ:
create database empDB
GO
use empDB
GO
create table EmpContactPhone (Employee_ID int, MobileNumber bigint, serviceProvider varchar(30), LandlineNumber bigint)
use empDB
GO
alter table EmpContactPhone alter column Employee_ID int not null;
GO
alter table EmpContactPhone ADD PRIMARY KEY(Employee_ID) ;
UNIQUE (Duy nhất)
Các ràng buộc duy nhất được sử dụng để đảm bảo rằng chỉ các giá trị duy nhất được nhập vào một cột hoặc tập hợp các cột. Nó cho phép các nhà phát triển đảm bảo rằng không có giá trị trùng lặp nào được nhập vào. Các khóa chính luôn luôn là duy nhất (unique). Khóa UNIQUE thực thi tính toàn vẹn của thực thể bởi vì một khi các ràng buộc được áp dụng, không có hai dòng nào trong bảng có thể có cùng giá trị cho các cột. Ràng buộc UNIQUE cho phép giá trị null. Một bảng có thể có nhiều hơn một ràng buộc UNIQUE.
Cú pháp:
create table <table_name> ([column_list,] <column_name> <data_type> UNIQUE [,column_list])
Ví dụ:
create table EmpContactPhoneUnique (Employee_ID int, MobileNumber bigint unique, serviceProvider varchar(30), LandlineNumber bigint)
Với cú pháp trên, khi insert dữ liệu ở cột MobileNumber nếu bị trùng nhau ngooài , SQL sẽ báo lỗi, ví dụ:
insert into EmpContactPhoneUnique values (1,0782222567,'vinaphone','84')
insert into EmpContactPhoneUnique values (2,0782222567,'vinaphone','84')
FOREIGN KEY (Khóa ngoại)
Khóa ngoại trong bảng là cột trỏ đến khóa chính hoặc cột duy nhất trong bảng. Các ràng buộc khóa ngoại được sử dụng để thực thi tính toàn vẹn của tham chiếu. Có thể hiểu khóa ngoại là mối liên kết giữa hai bảng với nhau tạo thành một lược đồ cơ sở dữ liệu quan hệ.
Lưu ý: khóa ngoại của bảng này cần liên kết với khóa chính của bảng khác, nếu không câu lệnh khởi tạo sẽ báo lỗi
Cú pháp cho khóa ngoại như sau:
CREATE TABLE <table_name1>([column_list,]) <column_name> <datatype> FOREIGN KEY REFFERENCES <table_name> (<pk_column_name> [,column_list])
Giải thích:
- table_name: tên của bảng mà có cột primary key được tham chiếu tới
- <pk_column_name>: tên cột primary key của bảng
Ví dụ:
create database empDB
GO
use empDB
GO
create table EmpContactPhone (Employee_ID int, MobileNumber bigint, serviceProvider varchar(30), LandlineNumber bigint)
use empDB
GO
alter table EmpContactPhone alter column Employee_ID int not null;
GO
alter table EmpContactPhone ADD PRIMARY KEY(Employee_ID) ;
create table EmpPhoneExpenses (Expense_ID int primary key identity, Employee_ID int FOREIGN KEY REFERENCES EmpContactPhone(Employee_ID),Amount bigint)
Ở ví dụ phía trên, chúng ta hiểu cột Employee_ID của bảng EmpPhoneExpenses có khóa ngoại và và liên kết nó với cột Employee_ID là khóa chính của bảng EmpContactPhone.
CHECK
Ràng buộc này sử dụng để kiểm tra giới hạn các giá trị có thể được đặt trong cột. Ràng buộc CHECK thực thi tính toàn vẹn của dữ liệu.
Ví dụ: một ràng buộc kiểm tra có thể được đưa ra nếu giá trị được nhập vào cho cột biểu diễn Độ tuổi cử tri phải lớn hơn hoặc bằng 18.
Nếu dữ liệu được nhập cho cột không phù hợp với điều kiện thì việc chèn sẽ không thành công.
Ràng buộc kiểm tra hoạt động bằng cách chỉ định điều kiện tìm kiếm, điều kiện này có thể đánh giá là TRUE, FALSE hoặc không xác định. Các giá trị đánh giá là FALSE sẽ bị từ chối. Nhiều ràng buộc CHECK có thể được chỉ định cho một cột duy nhất. Một ràng buộc CHECK đơn lẻ cũng có thể được áp dụng cho nhiều cột bằng cách tạo nó ở cấp bảng.
Cú pháp:
Ví dụ:
create table Employee (ID int primary key identity, Name nvarchar(30), Phone varchar(30), Age int check (Age > 18))
Bước tiếp theo, thử test insert dữ liệu vào bảng employee với dữ liệu vi phạm ràng buộc:
insert into Employee values (N'Toan Ngo Vinh','0911111111',15)
NOT NULL
Ràng buộc not null đảm bảo giá trị trong cột không được phép có giá trị rỗng. Sử dụng để đảm bảo tính toàn vện và logic của dữ liệu, tương tự ràng buộc CHECK
Bài tập
Sử dụng T-SQL để thực hiện các yêu cầu sau:
Tạo database tê n 'studentManagement'
Sử dụng database trên để thực hiện các yêu cầu sau:
Tạo bảng class với các thông tin sau:
Column | Datatype | Constraint | Description |
ClassId | int | not null | |
ClassName | nvarchar(30) |
Tạo bảng student với thông tin sau:
Column | Datatype | Constraint | Description |
StudentId | int | not null | |
StudentName | nvarchar(50) | ||
BirthDate | datetime | ||
ClassId | int |
Tạo bảng subject với thông tin sau:
Column | Datatype | Constraint | Description |
SubjectId | int | not null | |
SubjectName | nvarchar(100) | ||
SessionCount | int |
Tạo bảng result với thông tin sau:
Column | Datatype | Constraint | Description |
StudentId | int | not null | |
SubjectId | int | not null | |
Mark | int |
Tạo các ràng buộc primary key cho bảng ( sử dụng theo một trong 2 cách alter hoặc đưa ràng buộc vào khi tạo bảng) :
Constraint Name | Table | Columns | Description |
PK_Class | Class | ClassId | |
PK_Student | Student | StudentId | |
PK_Subject | Subject | SubjectId | |
PK_Result | Result | StudentId,SubjectId |
Tạo ràng buộc foreign key cho bảng ( sử dụng theo một trong 2 cách alter hoặc đưa ràng buộc vào khi tạo bảng):
Constraint Name | Refferencing Table | Foreign Key Column | Referenced Table | Referenced Column |
FK_Student_Class | Student | ClassId | Class | ClassId |
FK_Result_Student | Result | StudentId | Student | StudentId |
FK_Result_Subject | Result | SubjectId | Subject | SubjectId |
Sửa bảng Result và đổi kiểu dữ liệu cột Mark từ int sang float
Tạo ràng buộc check cho bảng ( sử dụng theo một trong 2 cách alter hoặc đưa ràng buộc vào khi tạo bảng):
Constraint Name | Table | Columns | Condition |
CK_Subject_Check_SessionCount | Subject | SessionCount | SessionCount > 0 |
Nhập liệu vào bảng:
Class
ClassId | ClassName |
1 | A1 |
2 | A2 |
3 | A3 |
4 | A4 |
5 | A5 |
Student
StudentId | StudentName | BirthDate(dd/mm/yyyy) | ClassId |
1 | Toàn Ngô Vĩnh | 01/01/1992 | 1 |
2 | Nguyễn Văn Test | 08/06/1993 | 3 |
3 | Nguyễn Văn B | 10/02/2001 | 4 |
4 | Nguyễn Văn C | 30/06/1998 | 1 |
5 | Nguyễn Văn D | 24/08/1995 | 2 |
Subject
SubjectId | SubjectName | SessionCount |
1 | C Programming | 20 |
2 | HTML/CSS | 15 |
3 | Database Management | 30 |
Result
StudentId | SubjectId | Mark |
1 | 1 | 8 |
1 | 2 | 7 |
2 | 3 | 5 |
3 | 2 | 7 |
4 | 3 | 8 |
5 | 2 | 4 |