CONSTRAINT là một trong những quy tắc áp dụng trong SQL Server. Có nhiều loại CONSTRAINT khác nhau. Cùng tôi tìm hiểu kỹ hơn nhé.
Mục lục
1. CONSTRAINT trong SQL là gì?
Constraint được sử dụng để đảm bảo các điều kiện đầu vào đúng, đảm bảo sự chính xác và sự toàn vẹn của dữ liệu.
Thông thường sẽ có 6 loại ràng buộc trong SQL Server. Mỗi loại này đều là những quy tắc được áp dụng trên các cột dữ liệu
2. Các RÀNG BUỘC có sẵn trong SQL Server
Loại ràng buộc | Ý nghĩa |
NOT NULL | Khi muốn dữ liệu không nhận giá trị NULL trong cột dữ liệu. |
DEFAULT | Nếu các dữ liệu của cột không xác định hoặc không nhập sẽ được gán cho các giá trị mặc định trước đó đã setting. |
UNIQUE | Đảm bảo dữ liệu không bị lặp lại với các dữ liệu khác. |
PRIMARY KEY (Khóa chính) | Sử dụng cài đặt khóa chính trong bảng, xác định các dữ liệu phải là duy nhất (không trùng lặp) trên các cột được gán lệnh. Việc khai báo yêu cầu các cột phải NOT NULL. |
FOREIGN KEY (Khóa ngoại) | Mỗi hàng/bản ghi được nhận diện duy nhất trong bất kỳ bảng nào. |
CHECK | Đảm bảo các dữ liệu trong cột phải thỏa mãn điều kiện mà bạn đã gán. |
INDEX | Lấy dữ liệu từ Database nhanh nhất |
Những lệnh ràng buộc này có thể được xác định khi tạo một bảng bởi CREATE TABLE hoặc ALTER TABLE giúp bạn tạo ra các ràng buộc trước khi tạo bảng.
2.1 Một số lưu ý khác đối với RÀNG BUỘC CHECK
- Không thể định trong VIEW
- Bạn chỉ có thể tham chiếu các dữ liệu ở bảng đã khai báo ràng buộc. Còn lại không thể tham ở bảng khác, nếu muốn phải dùng Function để trích xuất dữ liệu.
- Trong định nghĩa điều kiện không thể sử dụng các truy vấn con (Subquery)
2.2 Hướng dẫn sử dụng các ràng buộc (constraints)
Thuật toán quản lý Vay có thế chấp tài sản đơn giản thể hiện qua sơ đồ như sau:
NOT NULL
Nếu tạo mới bảng:
CREATE TABLE KhachHang ( MaKH char(10) NOT NULL, HoTen nvarchar(50), DiaChi nvarchar(50), DienThoai varchar(50), NgaySinh date );
Nếu sửa bảng:
ALTER TABLE KhachHang MODIFY MaKH char(10) NOT NULL;
Sử dụng lệnh DEFAULT
Cột NgayVay lấy giá trị mặc định là ngày hiện tại nếu ngày vay không thể xác định. Sử dụng function GETDATE() để lấy giá trị ngày hiện tại.
Nếu tạo mới bảng:
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 ); Nếu sửa bảng ALTER TABLE Vay ADD CONSTRAINT df_ngay_vay DEFAULT GETDATE() FOR NgayVay;
Sử dụng lệnh PRIMARY KEY (khóa chính)
Nếu bạn sử dụng lệnh này cho MaTaiSan trên bảng MATAISAN
Tạo mới bảng:
Cách 1: 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: Khai báo 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 ); Sửa đổi bảng: ALTER TABLE TaiSan ADD CONSTRAINT pk_mats PRIMARY KEY (MaTaiSan);
Sử dụng FOREIGN KEY (khóa ngoại)
Lệnh ràng buộc ví dụ được sử dụng trên bảng VAY cho cột MaKH
Tạo mới bảng
Cách 1: 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: Khai báo 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 ); Sửa đổi bảng ALTER TABLE Vay ADD CONSTRAINT fk_makh FOREIGN KEY (MaKH) REFERENCES KhachHang(MaKH);
Sử dụng lệnh UNIQUE
Áp dụng trên bảng KhachHang cho trường DienThoai
Tạo mới bảng
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 );
Sửa đổi bảng:
ALTER TABLE KhachHang ADD CONSTRAINT unique_dien_thoai UNIQUE (DienThoai);
Sử dụng lệnh Check constraint trong sql
Tao Constraint Check trên trường NgayVaoLam > ‘1/1/1997’ của bảng NhanVien.
ALTER TABLE NhanVien ADD CONSTRAINT check_ngay_vao_lam CHECK (NgayVaoLam > '1997-1-1');
Tao Constraint 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); Tao Constraint kiểm tra trên trường GiaTri>=2 của bảng TaiSan ALTER TABLE TaiSan ADD CONSTRAINT check_gia_tri CHECK (GiaTri > 2);
Tao Constraint kiểm tra trên trường ThoiHan khoảng 1 đến 12 tháng của bảng Vay
ALTER TABLE Vay ADD CONSTRAINT check_thoi_han CHECK (ThoiHan BETWEEN 1 AND 12);
3. Xóa RÀNG BUỘC trong SQL
Lệnh 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ỏ kiểm tra trên trường ThoiHan từ 1-12 tháng gán ở trên
ALTER TABLE Vay DROP CONSTRAINT check_thoi_han CHECK (ThoiHan BETWEEN 1 AND 12);
4. Bỏ kích hoạt và kích hoạt CONSTRAINT
Đôi khi bạn không muốn lệnh CONSTRAINT hoạt động nhưng lại không muốn xóa chúng. Đừng lo lắng vì đã có lệnh bỏ và kích hoạt lại lệnh.
Câu lệnh là:
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 Constraint Check trên trường NgayHetHan phải lớn hơn NgayVay của bảng Vay
ALTER TABLE Vay NOCHECK CONSTRAINT check_ngayhethan CHECK (NgayHetHan > NgayVay);
Trường hợp muốn kích hoạt lại ràng buộc, bạn sử dụng lệnh sau:
ALTER TABLE <tên table chứa ràng buộc> WITH CHECK CHECK CONSTRAINT <tên ràng buộc> Ví dụ: Kích hoạt lại ví dụ trên ALTER TABLE Vay WITH CHECK CHECK CONSTRAINT check_ngayhethan CHECK (NgayHetHan > NgayVay);
5. RÀNG BUỘC toàn vẹn trong SQL Server
Integrity constraint (ràng buộc toàn vẹn) chỉ nên sử dụng khi bạn muốn đảm bảo 100% sự chính xác và tính nhất quán trong các dữ liệu của Cơ sở dữ liệu.
Integrity constraint được sử dụng thông qua khái niệm toàn vẹn tham chiếu (referential integrity – RI)
Như vậy là tôi đã hướng dẫn bạn add constraint trong sql. Khá đơn giản thôi, nhưng bạn cần cố gắng thực hiện mỗi ngày. Đón chờ các bài viết tiếp theo của tôi nữa nhé.