SQL - Ràng buộc Kiểm tra: Hướng dẫn Thân thiện về Tính toàn vẹn Dữ liệu

Xin chào các nhà pháp sư SQL tương lai! Hôm nay, chúng ta sẽ nhảy vào thế giới kỳ diệu của Ràng buộc Kiểm tra SQL. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người dẫn đường cho bạn trong chuyến phiêu lưu này, và chúng ta sẽ cùng nhau từng bước. Nên hãy lấy饮料 yêu thích của bạn, ngồi thoải mái, và bắt đầu hành trình của chúng ta!

SQL - Check Constraint

Ràng buộc Kiểm tra SQL: Người bạn tốt nhất của Dữ liệu

Hãy tưởng tượng bạn đang tổ chức một buổi tiệc và bạn muốn đảm bảo rằng chỉ có khách trên 18 tuổi mới có thể tham gia. Đó chính xác là điều mà Ràng buộc Kiểm tra làm cho cơ sở dữ liệu của bạn - nó hoạt động như một bảo vệ, đảm bảo rằng chỉ có dữ liệu đúng mới được vào!

Một Ràng buộc Kiểm tra là một quy tắc chúng ta đặt trên một cột (hoặc các cột) trong bảng để đảm bảo rằng dữ liệu phải thỏa mãn một số điều kiện nhất định trước khi được phép vào. Nó giống như tặng cho cơ sở dữ liệu của bạn một siêu năng lực để duy trì tính toàn vẹn dữ liệu!

Hãy cùng nhìn vào một số ví dụ để làm rõ hơn.

Ràng buộc Kiểm tra trên một Cột: Cột Đơn

Khi chúng ta áp dụng một Ràng buộc Kiểm tra trên một cột duy nhất, chúng ta đang nói với cột đó, "Hey, bạn có một công việc - đảm bảo rằng dữ liệu tuân theo quy tắc này!"

Dưới đây là một ví dụ:

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INT CHECK (Age >= 18)
);

Trong ví dụ này, chúng ta đang tạo một bảng Employees với một Ràng buộc Kiểm tra trên cột Age. Ràng buộc này đảm bảo rằng bất kỳ tuổi nào được nhập phải là 18 hoặc lớn hơn. Nếu ai đó cố gắng chèn một nhân viên dưới 18 tuổi, cơ sở dữ liệu sẽ lịch sự từ chối, giống như bảo vệ của buổi tiệc!

Hãy thử chèn một số dữ liệu:

-- Điều này sẽ thành công
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (1, 'John', 'Doe', 25);

-- Điều này sẽ thất bại
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (2, 'Jane', 'Smith', 17);

Lệnh INSERT đầu tiên sẽ thành công vì 25 lớn hơn hoặc bằng 18. Tuy nhiên, lệnh thứ hai sẽ thất bại vì 17 không thỏa mãn Ràng buộc Kiểm tra của chúng ta. Bảo vệ dữ liệu của chúng ta đang làm việc!

Ràng buộc Kiểm tra trên Nhiều Cột: Cặp Đôi Động

Đôi khi, chúng ta cần kiểm tra một điều kiện liên quan đến nhiều hơn một cột. Đó là khi các Ràng buộc Kiểm tra đa cột rất hữu ích!

Dưới đây là một ví dụ:

CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
ShipDate DATE,
CHECK (ShipDate >= OrderDate)
);

Trong bảng Orders này, chúng ta đang đảm bảo rằng ShipDate luôn vào hoặc sau OrderDate. Cuối cùng, chúng ta không thể ship một đơn hàng trước khi nó được đặt, phải không? Điều đó sẽ yêu cầu du hành thời gian, và SQL chưa thực sự có khả năng đó... chưa!

Hãy thử nó ra:

-- Điều này sẽ thành công
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (1, '2023-06-01', '2023-06-03');

-- Điều này sẽ thất bại
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (2, '2023-06-01', '2023-05-31');

Lệnh INSERT đầu tiên hoạt động tốt vì ShipDate (ngày 3 tháng 6) là sau OrderDate (ngày 1 tháng 6). Lệnh thứ hai thất bại vì nó cố gắng ship đơn hàng (ngày 31 tháng 5) trước khi nó được đặt (ngày 1 tháng 6). Ràng buộc Kiểm tra của chúng ta bắt được sự cố thời gian này!

Ràng buộc Kiểm tra ở Mức Bảng: Con Mắt Toàn Cảnh

Đôi khi, chúng ta muốn tạo một Ràng buộc Kiểm tra liên quan đến nhiều cột nhưng không gắn với bất kỳ cột cụ thể nào. Chúng ta có thể làm điều này bằng cách tạo một ràng buộc ở mức bảng.

Dưới đây là cách nó trông như thế nào:

CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50),
UnitPrice DECIMAL(10,2),
DiscountedPrice DECIMAL(10,2),
CONSTRAINT CHK_Price CHECK (DiscountedPrice <= UnitPrice)
);

Trong bảng Products này, chúng ta đang đảm bảo rằng DiscountedPrice luôn nhỏ hơn hoặc bằng UnitPrice. Cuối cùng, chúng ta không muốn vô tình định giá sản phẩm cao hơn sau khi giảm giá!

Hãy xem nó trong hành động:

-- Điều này sẽ thành công
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (1, 'Super Gadget', 99.99, 79.99);

-- Điều này sẽ thất bại
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (2, 'Mega Widget', 49.99, 59.99);

Lệnh INSERT đầu tiên hoạt động vì DiscountedPrice (79.99) nhỏ hơn UnitPrice (99.99). Lệnh thứ hai thất bại vì nó cố gắng đặt DiscountedPrice (59.99) cao hơn UnitPrice (49.99). Ràng buộc Kiểm tra của chúng ta cứu chúng ta khỏi sai lầm định giá này!

Ràng buộc Kiểm tra trên Cột Hiện Có: Cải tạo

Vậy nếu chúng ta đã có một bảng và muốn thêm một Ràng buộc Kiểm tra? Không có vấn đề! Chúng ta cũng có thể thêm ràng buộc vào các cột hiện có.

Dưới đây là cách làm:

-- Đầu tiên, hãy tạo một bảng không có ràng buộc
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
GPA DECIMAL(3,2)
);

-- Bây giờ, hãy thêm một Ràng buộc Kiểm tra
ALTER TABLE Students
ADD CONSTRAINT CHK_GPA CHECK (GPA >= 0.0 AND GPA <= 4.0);

Trong ví dụ này, chúng ta đang thêm một Ràng buộc Kiểm tra để đảm bảo rằng GPA luôn介于 0.0 và 4.0.

Hãy kiểm tra nó:

-- Điều này sẽ thành công
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (1, 'Alice', 'Johnson', 3.75);

-- Điều này sẽ thất bại
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (2, 'Bob', 'Smith', 4.5);

Lệnh INSERT đầu tiên hoạt động vì 3.75 nằm trong phạm vi GPA cho phép. Lệnh thứ hai thất bại vì 4.5 cao hơn giới hạn tối đa của chúng ta là 4.0. Ràng buộc Kiểm tra cải tạo của chúng ta đang giữ GPA của chúng ta trong tầm kiểm soát!

Xóa Ràng buộc Kiểm tra: Cổng Great Escape

Đôi khi, chúng ta có thể cần xóa một Ràng buộc Kiểm tra. Có thể là vì quy tắc kinh doanh của chúng ta đã thay đổi, hoặc chúng ta đang tái cấu trúc cơ sở dữ liệu. Dù lý do gì, SQL cung cấp cho chúng ta cách để xóa ràng buộc.

Dưới đây là cách làm:

-- Để xóa một ràng buộc có tên
ALTER TABLE Students
DROP CONSTRAINT CHK_GPA;

-- Để xóa một ràng buộc không có tên (SQL Server syntax)
ALTER TABLE Employees
DROP CONSTRAINT ALL;

Và thế là ràng buộc đã biến mất! Nhưng hãy nhớ, với quyền lực lớn cũng đi kèm với trách nhiệm lớn. Đảm bảo rằng bạn thực sự muốn xóa ràng buộc trước khi bạn làm điều đó!

Kết luận: Bộ công cụ Tính toàn vẹn Dữ liệu

Và thế là chúng ta đã cùng nhau hành trình qua vùng đất của Ràng buộc Kiểm tra SQL, từ bảo vệ đơn cột đến sentinel đa cột, từ người giám sát mức bảng đến người xóa ràng buộc.

Nhớ rằng, Ràng buộc Kiểm tra là những người bảo vệ trung thành của vương quốc dữ liệu của bạn. Họ làm việc không ngừng để đảm bảo rằng chỉ có dữ liệu đúng mới được vào bảng của bạn, giữ cho cơ sở dữ liệu của bạn sạch sẽ, nhất quán và đáng tin cậy.

Khi bạn tiếp tục hành trình SQL của mình, hãy giữ các Ràng buộc Kiểm tra trong bộ công cụ của bạn. Họ sẽ là những người bạn đáng tin cậy trong việc duy trì tính toàn vẹn dữ liệu và ngăn chặn những dữ liệu quái vật nhỏ từ việc xâm nhập!

Bây giờ, hãy tiến lên và ràng buộc với tự tin! Chúc may mắn với SQL!

Credits: Image by storyset