Thứ Hai, 24 tháng 7, 2023

Khóa ngoại Foreign Key trong SQL Server

Ở bài trước bạn đã biết được cách tạo khóa chính rồi, vậy thì trong bài này mình sẽ hướng dẫn bạn cách tạo khóa ngoại trong SQL Server. Khóa ngoại là thành phần rất quan trọng tạo nên một hệ thống cơ sở dữ liệu quan hệ, tức là các table sẽ có mối liên hệ với nhau thông qua khóa ngoại.

Mục lục

  • 1. Khóa ngoại Foreign Key là gì?
  • 2. Cách tạo Freign Key trong SQL Server
    • Tạo ngay lệnh Create Table
    • Tạo bằng lệnh Alter Table
  • 3. Xóa khóa ngoại Foreign Key
  • 4. Hành động đảm bảo ràng buộc toàn vẹn
    • Action dành cho Delete
    • Action dành cho Update

1. Khóa ngoại Foreign Key là gì?

Khóa ngoại hay còn gọi là foreign key, đây là mối liên kết giữa hai bảng với nhau tạo thành một lược đồ cơ sở dữ liệu quan hệ. 

Giả sử ta có hai bảng vendor_groups và vendors như sau:

vendors
1
2
3
4
5
CREATE TABLE procurement.vendors (
        vendor_id INT IDENTITY PRIMARY KEY,
        vendor_name VARCHAR(100) NOT NULL,
        group_id INT NOT NULL,
);

vendor_group
1
2
3
4
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 các nhóm nhà cung cấp, ví dụ nhà cung cấp hạng A, hạng B, ...
  • Bảng vendors 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 một nhóm nào đó, và một nhóm có thể có nhiều nhà cung cấp, đây là quy luật bình thường trong một hệ thống bán hàng.

Để thẻ hiện mối liên hệ này thì trong bảng vendors sẽ có một column group_id trỏ đến khóa chính của bảng vendor_group, ta gọi đây là foreign key.

Một số lưu ý của khóa ngoại:

  • Bảng A có khóa ngoại trỏ đến 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 các 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

Tương tự như khóa chính, chúng ta có hai cách để tạo khóa ngoại. Thứ nhất là tạo ngay lệnh create table và thứ hai là sử dụng lệnh alter table.

Tạo ngay lệnh Create Table

Ta sử dụng từ khóa CONSTRAINT ngay ở phía cuối danh sách column.

1
2
3
4
5
6
7
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)
);

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:

1
2
3
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 sử dụng sau khi bạn đã tạo xong table.

1
2
ALTER TABLE procurement.vendors 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 bạn muốn xóa một Foreign Key nào đó thì sử dụng cú pháp sau:

1
2
ALTER TABLE table_name
DROP FOREIGN KEY foreign_key_name;

Ví dụ: Xóa foreign key fk_group ra khỏi table vendors

1
2
ALTER TABLE procurement.vendors
DROP FOREIGN KEY fk_group;

Trên là cách tạo và quản lý khóa ngoại trong SQL Server.

4. Hành động đảm bảo ràng buộc toàn vẹn

Các ràng buộc khóa ngoại giúp đảm bảo tính toàn vẹn của dữ liệu của các tham chiếu, điều đó có nghĩa là khi bạn thêm một dòng record thì giá trị của khóa ngoại phải tồn tại ở bảng cha.

Chúng ta có hai hành động chính tác động đến khóa ngoại đó là DELETE và UPDATE, và để giữ tính toàn vẹn thì SQL Server cung cấp hai referential actions như sau:

1
2
3
4
FOREIGN KEY (foreign_key_columns)
    REFERENCES parent_table(parent_key_columns)
    ON UPDATE action
    ON DELETE action;

Trong đó:

  • ON UPDATE action là ràng buộc dành cho hành động cập nhật
  • ON DELETE action là ràng buộc dành cho hành động xóa

Chúng ta có 4  action gồm NO ACTIONCASCADESET NULL, và SET DEFAULT

Action dành cho Delete

Chi tiết như sau:

  • ON DELETE NO ACTION SQL Server sẽ trả về một 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 tương ứng với hàng đã xóa khỏi bảng cha.
  • ON DELETE SET NULL SQL Server sẽ cập nhật dữ liệu ở bảng con sang NULL, để sử dụng được thiết lập này thì column foreign 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ì foreign key phải có giá trị DEFAULT.

Mặc định nếu bạn không thiết lập thì action là ON DELETE NO ACTION.

Action dành cho Update

Chi tiết như sau:

  • ON UPDATE NO ACTION SQL Server sẽ trả về lỗi và khôi phục hành động update ở bảng cha
  • ON UPDATE CASCADE SQL Server sẽ cập nhật dữ liệu ở bảng con tương ứng với bảng cha
  • ON UPDATE SET NULL SQL Server sẽ cập nhật dữ liệu ở bảng con sang NULl, để sử dụng được thiết lập này thì column foreign 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ì foreign key phải có giá trị DEFAULT.

Nhìn chung các action của cả hai hành động đều có ý nghĩa giống nhau.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master