Phần 7: Khóa ngoại trong SQL Server – Học SQL Server Basic

Table of Contents
1. Khóa ngoại Foreign Key là gì?
Khóa ngoại hay còn được gọi là overseas key, đây chính là mối liên kết giữa 2 bảng với nhau tạo nên 1 lược đồ cơ sở dữ liệu quan hệ.
Giả sử ta có 2 bảng vendor_groups và distributors như dưới đây:
CREATE TABLE procurement.distributors (
vendor_id INT IDENTITY PRIMARY KEY,
vendor_name VARCHAR(100) NOT NULL,
group_id INT NOT NULL,
);
CREATE TABLE procurement.vendor_groups (
group_id INT IDENTITY PRIMARY KEY,
group_name VARCHAR (100) NOT NULL
);
Trong đó:
- Bảng vendor_group sẽ lưu trữ danh sách những nhóm nhà cung cấp, ví dụ nhà cung cấp hạng A, hạng B, …
- Bảng distributors sẽ lưu trữ danh sách nhà cung cấp
Mối liên hệ: Mỗi nhà cung cấp sẽ thuộc 1 nhóm nào đấy, và 1 nhóm có thể có nhiều nhà cung cấp, đây chính là quy luật bình thường trong 1 hệ thống bán hàng.
Để thẻ hiện mối liên hệ này thì trong bảng distributors sẽ có 1 column group_id trỏ tới khóa chính của bảng vendor_group, ta gọi đây chính là overseas key.
Những chú ý của khóa ngoại:
- Bảng A có khóa ngoại trỏ tới bảng B thì ta gọi A là bảng Cha, còn B là bảng con ( mình tự đặt cho dễ nhớ ;))
- Giá trị của khóa ngoại của bảng con phải tồn tại trong những giá trị khóa chính của bảng cha, đây ta gọi là ràng buộc toàn vẹn.
2. Cách tạo Freign Key trong SQL Server
Giống nhau như khóa chính, ta có 2 cách để tạo khóa ngoại. Thứ nhất là tạo ngay lệnh create desk và thứ 2 là sử dụng lệnh alter desk.
Tạo ngay lệnh Create Table
Ta sử dụng từ khóa CONSTRAINT ngay ở phía cuối danh sách column.
CREATE TABLE procurement.distributors (
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)
);
Chú ý:
- fk_group là tên của khóa ngoại, ta nên đặt tên để sau này dễ dàng quản lý
Trường hợp có nhiều column làm khóa ngoại thì ta sử dụng cú pháp sau:
CONSTRAINT fk_constraint_name
FOREIGN KEY (column_1, column2,...)
REFERENCES parent_table_name(column1,column2,..)
Tạo bằng lệnh Alter Table
Lệnh này chỉ được dùng sau khi các bạn đã tạo xong desk.
ALTER TABLE procurement.distributors ADD FOREIGN KEY fk_group
FOREIGN KEY (group_id) REFERENCES procurement.vendor_groups(group_id)
3. Xóa khóa ngoại Foreign Key
Nếu như bạn cần xóa 1 Foreign Key nào đấy thì sử dụng cú pháp sau:
ALTER TABLE table_name
DROP FOREIGN KEY foreign_key_name;
Ví dụ: Xóa overseas key fk_group ra khỏi desk distributors
ALTER TABLE procurement.distributors
DROP FOREIGN KEY fk_group;
Trên là một cách tạo và quản lý khóa ngoại trong SQL Server.
4. Hành động bảo đảm ràng buộc toàn vẹn
Các ràng buộc khóa ngoại giúp bảo đảm tính toàn vẹn của dữ liệu của các tham chiếu, điều ấy nghĩa là khi các bạn thêm 1 dòng document thì giá trị của khóa ngoại phải tồn tại ở bảng cha.
Chúng ta có 2 hành động chính tác động tới khóa ngoại đó là DELETE và UPDATE, và để giữ tính toàn vẹn thì SQL Server cung cấp 2 referential actions như dưới đây:
FOREIGN KEY (foreign_key_columns)
REFERENCES parent_table(parent_key_columns)
ON UPDATE motion
ON DELETE motion;
Trong đó:
- ON UPDATE motion là ràng buộc dành cho hành động update
- ON DELETE motion là ràng buộc dành cho hành động xóa
Chúng ta có 4 motion gồm NO ACTION, CASCADE, SET NULL, và SET DEFAULT.
Action dành cho Delete
Chi tiết như dưới đây:
- ON DELETE NO ACTION SQL Server sẽ trả về 1 lỗi và dữ liệu ở bảng cha sẽ được khôi phục.
- ON DELETE CASCADE SQL Server xóa các hàng trong bảng con ứng với hàng đã xóa khỏi bảng cha.
- ON DELETE SET NULL SQL Server sẽ update dữ liệu ở bảng con sang NULL, để sử dụng được thiết lập này thì column overseas key phải cho phép NULL.
- ON DELETE SET DEFAULT SQL Server sẽ trả về giá trị mặc định, để sử dụng được thiết lập này thì overseas key phải có giá trị DEFAULT.
Mặc định nếu như bạn không thiết lập thì motion là ON DELETE NO ACTION.
Action dành cho Update
Chi tiết như dưới đây:
- ON UPDATE NO ACTION SQL Server sẽ trả về lỗi và khôi phục hành động replace ở bảng cha
- ON UPDATE CASCADE SQL Server sẽ update dữ liệu ở bảng con ứng với bảng cha
- ON UPDATE SET NULL SQL Server sẽ update dữ liệu ở bảng con sang NULl, để sử dụng được thiết lập này thì column overseas key phải cho phép NULL.
- ON UPDATE SET DEFAULT SQL Server sẽ trả về giá trị mặc định, để sử dụng được thiết lập này thì overseas key phải có giá trị DEFAULT.
Nhìn chung các motion của cả 2 hành động đều có ý nghĩa giống nhau.
Như thế, qua bài này, mình đã giới thiệu tới anh em cách tạo và quản lý khóa ngoại trong SQL Server. Cảm ơn anh em đã đọc.