Trong hướng dẫn này, bạn sẽ học cách sử dụng ràng buộc FOREIGN KEY
của SQL Server để thực thi liên kết dữ liệu giữa hai bảng.
Hãy xem các bảng vendor_groups
và vendors
sau đây:
CREATE TABLE procurement.vendor_groups (
group_id INT IDENTITY PRIMARY KEY,
group_name VARCHAR (100) NOT NULL
);
CREATE TABLE procurement.vendors (
vendor_id INT IDENTITY PRIMARY KEY,
vendor_name VARCHAR(100) NOT NULL,
group_id INT NOT NULL,
);
Mỗi nhà cung cấp thuộc một nhóm nhà cung cấp và mỗi nhóm nhà cung cấp có thể có không hoặc nhiều nhà cung cấp. Mối quan hệ giữa các bảng vendor_groups
và vendors
là một-nhiều.
Đối với mỗi hàng trong bảng vendors
, bạn luôn có thể tìm thấy một hàng tương ứng trong bảng vendor_groups
.
Tuy nhiên, với thiết lập bảng hiện tại, bạn có thể insert một hàng vào bảng vendors
mà không có hàng tương ứng trong bảng vendor_groups
. Tương tự, bạn cũng có thể xóa một hàng trong bảng vendor_groups
mà không cần cập nhật hoặc xóa các hàng tương ứng trong bảng vendors
dẫn đến các hàng trong bảng vendors
bị mất.
Để thực thi liên kết giữa dữ liệu trong bảng vendor_groups
và vendors
, bạn cần thiết lập khóa ngoại trong bảng vendors
.
Khóa ngoại (foreign key) là một cột hoặc một nhóm cột trong một bảng xác định duy nhất một hàng của bảng khác (hoặc cùng một bảng trong trường hợp tự tham chiếu).
Để tạo khóa ngoại, bạn sử dụng ràng buộc FOREIGN KEY
.
Các câu lệnh sau xóa bảng vendors
và tạo lại nó với một ràng buộc FOREIGN KEY
:
DROP TABLE vendors;
CREATE TABLE procurement.vendors (
vendor_id INT IDENTITY PRIMARY KEY,
vendor_name VARCHAR(100) NOT NULL,
group_id INT NOT NULL,
CONSTRAINT fk_group FOREIGN KEY (group_id)
REFERENCES procurement.vendor_groups(group_id)
);
Bảng vendor_groups
hiện nay được gọi là bảng cha đó là bảng để mà tham khảo ràng buộc khoá ngoại. Bảng vendors
được gọi là bảng con đó là bảng mà ràng buộc khoá ngoại được áp dụng.
Trong câu lệnh trên, mệnh đề sau đây tạo ra một ràng buộc FOREIGN KEY
có tên là fk_group
liên kết cột group_id
trong bảng vendors
với cột group_id
trong bảng vendor_groups
:
CONSTRAINT fk_group FOREIGN KEY (group_id) REFERENCES procurement.vendor_groups(group_id)
Cú pháp chung để tạo một ràng buộc FOREIGN KEY
như sau:
CONSTRAINT fk_constraint_name
FOREIGN KEY (column_1, column2,...)
REFERENCES parent_table_name(column1,column2,..)
Hãy xem xét cú pháp này một cách chi tiết.
Đầu tiên, chỉ định tên ràng buộc FOREIGN KEY
sau từ khóa CONSTRAINT
. Tên ràng buộc là tùy chọn do đó có thể tạo một ràng buộc FOREIGN KEY
như sau:
FOREIGN KEY (column_1, column2,...)
REFERENCES parent_table_name(column1,column2,..)
Trong trường hợp này, SQL Server sẽ tự động tạo tên cho ràng buộc FOREIGN KEY
.
Thứ hai, chỉ định danh sách các cột khóa ngoại được phân tách bằng dấu phẩy được đặt trong dấu ngoặc đơn sau từ khóa FOREIGN KEY
.
Thứ ba, chỉ định tên của bảng cha mà khóa ngoại tham chiếu đến và danh sách các cột được phân tách bằng dấu phẩy có liên kết với cột trong bảng con.
Đầu tiên, hãy insert một số nhóm nhà cung cấp vào bảng vendor_groups
:
INSERT INTO procurement.vendor_groups(group_name)
VALUES('Third-Party Vendors'),
('Interco Vendors'),
('One-time Vendors');
Tiếp theo, insert một nhà cung cấp mới kèm theo Id của một nhóm nhà cung cấp vào bảng vendors
:
INSERT INTO procurement.vendors(vendor_name, group_id)
VALUES('ABC Corp',1);
Câu lệnh đã hoạt động như mong đợi.
Tiếp theo, cố gắng insert một nhà cung cấp mới có Id của một nhóm nhà cung cấp không tồn tại trong bảng vendor_groups
:
INSERT INTO procurement.vendors(vendor_name, group_id)
VALUES('XYZ Corp',4);
SQL Server sẽ đưa ra lỗi sau:
The INSERT statement conflicted with the FOREIGN KEY constraint "fk_group". The conflict occurred in database "BikeStores", table "procurement.vendor_groups", column 'group_id'.
Trong ví dụ này, do ràng buộc FOREIGN KEY
, SQL Server đã từ chối câu lệnh insert và đưa ra lỗi.
Ràng buộc khóa ngoại đảm bảo tính toàn vẹn của tham chiếu. Nó có nghĩa là bạn chỉ có thể insert một hàng vào bảng con nếu có một hàng tương ứng trong bảng cha.
Bên cạnh đó, ràng buộc khóa ngoại cho phép bạn xác định các hành động tham chiếu khi hàng trong bảng cha được cập nhật hoặc xóa như sau:
FOREIGN KEY (foreign_key_columns)
REFERENCES parent_table(parent_key_columns)
ON UPDATE action
ON DELETE action;
Các mệnh đề ON UPDATE
và ON DELETE
xác định những hành động sẽ thực hiện khi một hàng trong bảng cha được cập nhật và xóa. Sau đây là những hành động được phép: NO ACTION
, CASCADE
, SET NULL
và SET DEFAULT
.
Nếu bạn xóa một hoặc nhiều hàng trong bảng cha, bạn có thể đặt một trong các hành động sau:
ON DELETE NO ACTION
: SQL Server phát sinh lỗi và khôi phục hành động xóa trên hàng trong bảng cha.ON DELETE CASCADE
: SQL Server xóa các hàng trong bảng con tương ứng với hàng đã xóa khỏi bảng cha.ON DELETE SET NULL
: SQL Server đặt các hàng trong bảng con thành NULL
nếu các hàng tương ứng trong bảng cha bị xóa. Để thực hiện hành động này, các cột khóa ngoại phải có giá trị rỗng.ON DELETE SET DEFAULT
: SQL Server đặt các hàng trong bảng con thành giá trị mặc định của chúng nếu các hàng tương ứng trong bảng cha bị xóa. Để thực hiện hành động này, các cột khóa ngoại phải có định nghĩa mặc định. Lưu ý rằng cột nullable có giá trị mặc định là NULL
nếu không có giá trị mặc định nào được chỉ định.Theo mặc định, SQL Server áp dụng ON DELETE NO ACTION
nếu bạn không chỉ định rõ ràng bất kỳ hành động nào.
Nếu bạn cập nhật một hoặc nhiều hàng trong bảng cha, bạn có thể đặt một trong các tác vụ sau:
ON UPDATE NO ACTION
: SQL Server phát sinh lỗi và khôi phục hành động cập nhật trên hàng trong bảng cha.ON UPDATE CASCADE
: SQL Server cập nhật các hàng tương ứng trong bảng con khi các hàng trong bảng cha được cập nhật.ON UPDATE SET NULL
: SQL Server đặt các hàng trong bảng con thành NULL
khi hàng tương ứng trong bảng cha được cập nhật. Lưu ý rằng các cột khóa ngoại phải có giá trị rỗng để hành động này thực thi.ON UPDATE SET DEFAULT
: SQL Server đặt giá trị mặc định cho các hàng trong bảng con có các hàng tương ứng trong bảng cha được cập nhật.Trong hướng dẫn này, bạn đã học cách sử dụng ràng buộc khóa ngoại của SQL Server để thực thi tính toàn vẹn tham chiếu giữa các bảng.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ tìm hiểu về GUID trong SQL Server và cách sử dụng hàm NEWID() để tạo giá trị GUID.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATETIMEOFFSET trong SQL Server để thao tác datetime với múi giờ.
Trong hướng dẫn này, bạn sẽ học cách lưu trữ thời gian trong ngày trong cơ sở dữ liệu bằng cách sử dụng kiểu dữ liệu TIME trong SQL Server.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATE trong SQL Server để lưu trữ dữ liệu ngày tháng trong một bảng.