FOREIGN KEY trong SQL Server

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.

Giới thiệu về ràng buộc FOREIGN KEY trong SQL Server

Hãy xem các bảng vendor_groupsvendors 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_groupsvendors 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_groupsvendors, 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 ràng buộc FOREIGN KEY trong SQL Server

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.

Ví dụ về ràng buộc FOREIGN KEY trong SQL Server

Đầ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.

Hành động tham chiếu

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 UPDATEON 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 NULLSET DEFAULT.

Hành động xóa các hàng trong bảng cha

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.

Hành động cập nhật các hàng trong bảng cha

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.

SQL Server
Bài Viết Liên Quan:
Sequence trong SQL Server
Trung Nguyen 31/07/2021
Sequence trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu về các đối tượng Sequence trong SQL Server để tạo ra một chuỗi các giá trị số dựa trên một đặc tả cụ thể.

Cột Identity trong SQL Server
Trung Nguyen 30/07/2021
Cột Identity trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng thuộc tính IDENTITY trong SQL Server để thêm cột định danh vào bảng.

CREATE TABLE trong SQL Server
Trung Nguyen 29/07/2021
CREATE TABLE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh CREATE TABLE trong SQL Server để tạo một bảng mới.

Ràng buộc NOT NULL trong SQL Server
Trung Nguyen 28/07/2021
Ràng buộc NOT NULL trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng ràng buộc NOT NULL trong SQL Server để đảm bảo một cột không chứa dữ liệu NULL.