Contents

5 ràng buộc SQL để đảm bảo cấu trúc cơ sở dữ liệu tốt

Bài học chính

Việc sử dụng các ràng buộc SQL là rất quan trọng để duy trì tính toàn vẹn của cơ sở dữ liệu, đồng thời đảm bảo tính nhất quán giữa các nội dung của nó. Một ràng buộc như vậy là ràng buộc NOT NULL, bắt buộc các cột không thể chấp nhận giá trị null, do đó thực thi tầm quan trọng của việc cung cấp thông tin hợp lệ trong các trường này.

Để duy trì tính toàn vẹn và chính xác của dữ liệu trong cơ sở dữ liệu quan hệ, điều quan trọng là phải triển khai các ràng buộc khóa chính trên các cột hoặc tập hợp cột cụ thể. Những mã định danh duy nhất này ngăn chặn sự trùng lặp hồ sơ và thúc đẩy việc tổ chức và truy xuất thông tin hiệu quả.

Ràng buộc khóa ngoại dùng để duy trì tính toàn vẹn của cơ sở dữ liệu quan hệ bằng cách thực thi tính toàn vẹn tham chiếu, đảm bảo rằng mỗi bản ghi trong bảng con tương ứng với bản ghi hiện có trong bảng cha. Những ràng buộc này rất cần thiết để duy trì tính liên kết của dữ liệu trên nhiều bảng và ngăn chặn các sửa đổi hoặc xóa trái phép có thể ảnh hưởng đến tính chính xác và tính nhất quán của toàn bộ cơ sở dữ liệu.

Cơ sở dữ liệu được tổ chức tốt rất quan trọng đối với nhiều chức năng, tuy nhiên nếu không thiết lập các giao thức để lưu trữ và thao tác dữ liệu thì sự hỗn loạn có thể xảy ra.

Các ràng buộc SQL được sử dụng để thiết lập các nguyên tắc lưu trữ dữ liệu trong một bảng cụ thể. Những ràng buộc này cho phép hệ thống tạo ra thông báo lỗi khi cố gắng chèn hoặc cập nhật thông tin mâu thuẫn với các tham số đã thiết lập. Bằng cách thực thi các quy tắc như vậy, cơ sở dữ liệu có thể duy trì tính nhất quán của dữ liệu và thực thi việc tuân thủ các tiêu chuẩn trên tất cả các bảng.

Hiện có một số loại ràng buộc SQL rất có lợi trong việc đảm bảo tính toàn vẹn và bảo mật dữ liệu trong cơ sở dữ liệu.

Ràng buộc KHÔNG NULL

Theo mặc định, các cột cơ sở dữ liệu cho phép lưu trữ các giá trị null. Null đại diện cho sự vắng mặt của bất kỳ giá trị nào. Ngược lại, ràng buộc không null bắt buộc một cột cụ thể phải loại trừ các giá trị null và thay vào đó yêu cầu một giá trị thực chất.

Câu lệnh khai báo nhằm thực thi yêu cầu rằng mỗi hàng trong bảng phải có mục nhập tương ứng trong các cột không thể rỗng tương ứng, được chỉ định bởi ràng buộc “NOT NULL”. Nói cách khác, không được phép chèn hoặc đưa một bản ghi mới vào cơ sở dữ liệu trừ khi tất cả các trường bắt buộc đều được điền dữ liệu, vì nếu không làm như vậy sẽ dẫn đến lỗi.

Hãy xem xét một trường hợp trong đó việc trình bày nhóm khách hàng dưới dạng bảng được coi là bắt buộc đối với mục đích của tổ chức. Trong trường hợp như vậy, có thể nên thận trọng khi đưa một số thông tin cụ thể không thể thiếu liên quan đến từng người bảo trợ vào cơ sở dữ liệu nói trên, một chi tiết cơ bản như vậy là danh pháp của người bảo trợ. Để đảm bảo tuân thủ các yêu cầu nhập dữ liệu, việc triển khai ràng buộc có tên “NOT NULL” có thể được áp dụng cho các thuộc tính bao gồm bắt buộc này, qua đó đảm bảo rằng sẽ không có tài khoản khách hàng nào tồn tại mà không cung cấp thông tin nhận dạng quan trọng này.

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Mobile_No int NOT NULL,
    Age int
);

Nếu một người cố gắng chèn một bản ghi khách hàng không có trường Tuổi, cơ sở dữ liệu sẽ xác nhận nỗ lực đó mà không tạo ra bất kỳ thông báo lỗi nào:

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 0723000000); 

Mặc dù có thể cố gắng chèn một bản ghi mà không bao gồm trường “FirstName”, hệ thống cơ sở dữ liệu sẽ tạo ra thông báo lỗi để phản hồi:

 ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null). 

Ràng buộc KHÓA CHÍNH

Khóa chính là thành phần thiết yếu trong bất kỳ hệ thống quản lý cơ sở dữ liệu quan hệ nào, đóng vai trò là mã định danh riêng biệt cho mỗi mục trong một bảng cụ thể. Chỉ định này đảm bảo tính đơn nhất và tính riêng biệt của dữ liệu có trong (các) cột nói trên, ngăn ngừa sự trùng lặp trong khi vẫn duy trì tính tổ chức và tính toàn vẹn giữa tất cả thông tin được lưu trữ.

Trong mọi cơ sở dữ liệu quan hệ, khóa chính là thành phần thiết yếu bao gồm các giá trị đặc biệt và không thể chứa giá trị rỗng. Nguyên tắc cơ bản của việc cấu trúc các bảng khẳng định rằng mỗi bảng chỉ nên có một khóa chính. Khóa chính này có thể bao gồm một cột đơn độc hoặc nhiều cột, được gọi chung là khóa chính tổng hợp.

Khi xây dựng cơ sở dữ liệu về thông tin khách hàng, điều cần thiết là phải thiết lập mã nhận dạng duy nhất cho từng khách hàng. Để đạt được mục tiêu này, người ta có thể triển khai khái niệm ràng buộc khóa chính, đảm bảo rằng không có hai khách hàng nào có số định danh giống hệt nhau.

Để triển khai ràng buộc khóa chính trong cơ sở dữ liệu MySQL, người ta có thể tham khảo mã ví dụ sau:

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
   PRIMARY KEY (ID)
); 

Cơ sở dữ liệu sẽ từ chối mọi nỗ lực của người dùng trong việc gửi dữ liệu có chứa mã định danh trùng lặp. Trong trường hợp xảy ra sự cố như vậy, một ngoại lệ sẽ được đưa ra biểu thị sự tồn tại của thông tin trùng lặp. Trong trường hợp được cung cấp, cá nhân cố gắng thêm hai mục có số nhận dạng giống nhau:

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 ); 

Cơ sở dữ liệu sẽ hiển thị thông báo lỗi:

 Duplicate entry '1' for key 'PRIMARY' 

Việc triển khai khóa chính nhằm ngăn chặn sự xuất hiện của các giá trị định danh trùng lặp trong một tập dữ liệu nhất định, bằng chứng là việc thay đổi mã định danh duy nhất được gán cho một bản ghi cụ thể sẽ dẫn đến việc cơ sở dữ liệu từ chối thao tác chèn hoặc cập nhật đã cố gắng hệ thống. Chức năng này đặc biệt quan trọng để duy trì tính toàn vẹn của dữ liệu và tránh sự thiếu nhất quán khi xử lý các tập hợp thông tin lớn như thông tin được tìm thấy trong hồ sơ khách hàng.

Ràng buộc khóa ngoại

Khóa ngoại đóng vai trò là phương tiện tạo liên kết giữa hai bảng bằng cách tham chiếu khóa chính của một bảng trong bảng phụ hoặc bảng liên quan. Điều này cho phép kết nối và phụ thuộc lẫn nhau giữa dữ liệu chứa trong các thực thể riêng biệt này, tạo điều kiện thuận lợi cho việc thiết lập các liên kết và kết nối thông qua những điểm chung được chia sẻ.

Mối quan hệ giữa hai bảng trong cơ sở dữ liệu quan hệ có thể được thiết lập thông qua việc sử dụng khóa chính và khóa ngoại. Trong ngữ cảnh này, bảng đóng vai trò là nguồn dữ liệu chính và sở hữu mã định danh duy nhất cho mỗi bản ghi được gọi là bảng “cha”, trong khi bảng dựa vào thông tin từ bảng khác để thiết lập các bản ghi riêng được gọi là bảng “con”. Theo đó, bất kỳ mục nào được ghi trong bảng con phải tương ứng với bản ghi hiện có trong bảng cha, đóng vai trò như một phương tiện liên kết và xác nhận.

Việc triển khai ràng buộc khóa ngoại đảm bảo duy trì mối quan hệ giữa các bảng cơ sở dữ liệu được kết nối với nhau bằng cách cấm mọi hoạt động có thể làm tổn hại đến các kết nối này. Cụ thể, việc xóa hoặc loại bỏ một bảng đóng vai trò là khóa ngoại cho một bảng khác bị hạn chế, đòi hỏi phải chấm dứt đồng thời cả hai bảng có liên quan để tránh làm gián đoạn liên kết của chúng.

Không giống như khóa chính, là khóa duy nhất trong một bảng, khóa ngoại có thể tồn tại trong nhiều phiên bản trong một bảng và có thể chứa các giá trị null. Ví dụ: trong hình minh họa được cung cấp, việc tạo đơn hàng đòi hỏi phải sử dụng giá trị của khóa ngoại customer\_id.

 CREATE TABLE Customers (
    customer_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);

INSERT INTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');

INSERT INTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07'); 

Khi cố gắng tạo giao dịch mà không có mã nhận dạng từ trước cho khách hàng, hệ thống sẽ hiển thị thông báo lỗi.

 Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`)) 

Hạn chế duy nhất

Ràng buộc duy nhất là một cơ chế trong cơ sở dữ liệu quan hệ đảm bảo tính duy nhất của các giá trị của một cột cụ thể trên tất cả các hàng trong một bảng. Tương tự như khóa chính, ràng buộc này duy trì tính nhất quán của dữ liệu bằng cách ngăn chặn sự trùng lặp thông tin. Việc không triển khai ràng buộc như vậy có thể dẫn đến cơ sở dữ liệu không có tổ chức cần phải can thiệp thủ công để xác định và loại bỏ các bản ghi dư thừa.

Người ta có thể sử dụng nhiều ràng buộc ĐỘC ĐÁO trong một bảng, trái ngược với một KHÓA CHÍNH, như được minh họa bằng việc tạo bảng “Khách hàng” với các số nhận dạng và số điện thoại đặc biệt. Việc thực hiện hạn chế như vậy được thực hiện thông qua việc sử dụng cú pháp tiếp theo trong hệ thống quản lý cơ sở dữ liệu MySQL:

 CREATE TABLE Customers (
    ID int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

Trong trường hợp có nhiều mục được thực hiện trong cơ sở dữ liệu sử dụng các số điện thoại giống hệt nhau, thông báo lỗi sẽ được tạo để cho biết sự trùng lặp đó.

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );

INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 ); 

Thông báo hoặc cảnh báo được tạo để phản hồi lần đăng nhập không thành công, bao gồm thông tin về tài khoản người dùng và mọi đặc quyền liên quan, thường tuân theo định dạng chuẩn bao gồm các chi tiết cụ thể như ngày và giờ của lần xác thực không thành công, tên người dùng hoặc tên tài khoản được liên kết với lần thử, mô tả ngắn gọn về bản chất của lỗi (ví dụ: cung cấp mật khẩu không chính xác) và hướng dẫn liên quan để giải quyết vấn đề

 Duplicate entry '254000000' for key 'Mobile_No' 

Ràng buộc UNIQUE, là một loại ràng buộc cơ sở dữ liệu cụ thể, đảm bảo rằng không có hai bản ghi nào trong cơ sở dữ liệu có các giá trị giống nhau cho các trường ID khách hàng hoặc số điện thoại di động của chúng.

KIỂM TRA Ràng buộc

Ràng buộc CHECK dùng để điều chỉnh phạm vi giá trị cho phép có thể được nhập trong một cột cụ thể, từ đó duy trì tính toàn vẹn và tính xác thực tổng thể của dữ liệu được lưu trữ trong đó. Bằng cách áp đặt các ràng buộc như vậy lên một cột cụ thể, người ta có thể hạn chế nó chỉ chấp nhận những giá trị đã được phê duyệt rõ ràng, do đó cung cấp một lớp bảo mật bổ sung chống lại bất kỳ sai lệch tiềm ẩn nào hoặc các mục nhập trái phép.

Ràng buộc CHECK yêu cầu mọi hàng hoặc bản ghi được chỉ định trong bảng đã chỉ định phải được đánh giá là đúng hoặc không xác định. Trong trường hợp đánh giá sai, cơ sở dữ liệu sẽ hiển thị thông báo lỗi.

Để hạn chế quyền truy cập vào một số hồ sơ khách hàng nhất định dựa trên độ tuổi, có thể sử dụng ràng buộc kiểm tra trong bảng Khách hàng của hệ thống quản lý cơ sở dữ liệu quan hệ nhất định như PostgreSQL. Ràng buộc này yêu cầu tất cả các cá nhân tìm kiếm dịch vụ phải ít nhất 18 tuổi, do đó ngăn chặn mọi nỗ lực cung cấp dịch vụ cho trẻ vị thành niên. Một minh họa về khái niệm này được cung cấp dưới dạng mã SQL:

 CREATE TABLE Customers (
    ID int NOT NULL,
    Age int CHECK(Age>=18),
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

Nếu người ta cố gắng nhập tuổi của khách hàng dưới ngưỡng 18 tuổi,

 INSERT INTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 ); 

Cơ sở dữ liệu có thể hiển thị thông báo cho biết có sự cố, có thể giống với định dạng sau:

 ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000) 

Cách thêm và xóa các ràng buộc SQL khỏi cơ sở dữ liệu

Tính linh hoạt mà các ràng buộc SQL mang lại là một tài sản có giá trị vì chúng có thể được sửa đổi thông qua việc sử dụng câu lệnh ALTER TABLE. Lệnh linh hoạt này cho phép người dùng thực hiện các điều chỉnh đối với các ràng buộc trong bảng của họ để đáp ứng các yêu cầu dữ liệu đang thay đổi.

Ngoài các ràng buộc SQL được đề cập ở đây, còn có rất nhiều ràng buộc mà người ta có thể khám phá để tạo cơ sở dữ liệu tùy chỉnh. Bắt đầu với những điều được nêu trong phần này sẽ là điểm khởi đầu phù hợp.