Thứ Ba, 25 tháng 7, 2023

Khóa ngoại (Foreign Key) trong MySQL

Chúng ta đã được học các lệnh tạo bảng (Create Table), khái niệm về khóa chính (Primary Key) và một số thành phần khác như UNIQUE, AUTO_INCREMENT, tuy nhiên tất cả các thành phần này đều xử lý trên một bảng duy nhất. Câu hỏi đặt ra là nếu có nhiều bảng thì liệu có mối liên hệ giữa chúng hay không? Câu trả lời là có, và đó chính là khóa ngoại foreign key.

Mục lục

  • 1. Khóa ngoại (Foreign Key) là gì?
    • Khóa ngoại giữa hai bảng
    • Khóa ngoại trỏ đến chính bảng đó
  • 2. Tạo khóa ngoại (Foreign Key) trong MySQL
    • Tạo trong lệnh tạo bảng create table
    • Tạo bằng lệnh ALTER TABLE
    • Tạo khóa ngoại trường hợp tham chiếu chính nó
  • 3. Xóa (Drop) Foreign Key
  • 4. Lời kết

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

Trong bài này tôi sẽ không trình bài khái niệm khóa ngoại một cách chi tiết nữa mà đi vào định nghĩa chính của nó. Foreign key là mối quan hệ giữa hai bảng và mối quan hệ này ta hay gọi là cha - con, nghĩa là nếu bảng A có một thuộc tính liên kết tới bảng B thì lúc này bảng B đóng vai trò là cha và bảng A đóng vai trò là con.

Khái niệm Foreign key là gì không chỉ có ở MySQL mà nó là một thành phần của tất cả các hệ quản trị CSDL như SQL Server, Oracle, Access, ... Nếu bạn đã từng học qua các mô hình CSLD thì không còn lạ gì khóa ngoại nữa.

Thông thường chúng ta có hai loại khóa ngoại đó là khóa ngoại giữa hai bảng và khóa ngoại trỏ đến chính nó (đệ quy).

Bài viết này được đăng tại tranvanbinh.vn

Khóa ngoại giữa hai bảng

Xét sơ đồ CSDL sau đây:

/319/customers-orders-tables.png

Các bạn thấy trong bảng customers và orders có một mối quan hệ với tên gọi là "mỗi order là của một customer nào đó". đây ta gọi là mối quan hệ (1:n), có nghĩa là một customer có thê có nhiều orders và mỗi order chỉ thuộc về một customer duy nhất. Xem kỹ hơn ta thấy trong bảng orders có field customerNumber và nó sẽ trỏ đến khóa chính (Primary Key) của bảng customers.

Như vậy ta có kế luận như sau:

Khóa ngoại ở bảng orders sẽ tham chiếu đến khóa chính của bảng customers. Lúc này bảng customers gọi là bảng cha và bảng order gọi là bảng con. Đây chính là điều BẮT BUỘC của khóa ngoại.

Khóa ngoại trỏ đến chính bảng đó

Xét sơ đồ CSDL sau đây:

mysql self join employees table png

Trong sơ đồ này nó có một khóa ngoại là reportsTo và trỏ đến chính khóa chính của nó employeeNumber. Mối quan hệ này ta nói như sau "mỗi nhân viên có thể là một nhân viên bình thường hoặc  là người quản lý của một nhân viên khác. Hằng ngày các nhân bị quản lý khác sẽ báo cáo (reportsTo) tới nhân viên quản lý". Sơ đồ này ta gọi là đệ quy, nghĩa là khóa ngoại sẽ tham chiếu tới chính table nó luôn. Trong thực tế cũng hay gặp trường hợp này nên các bạn cần lưu ý nhé.

2. Tạo khóa ngoại (Foreign Key) trong MySQL

Ta sẽ sử dụng cú pháp T-SQL để tạo khóa ngoại, chúng ta có khá nhiều các tạo và tùy vào nhu cầu của ban mà sử dụng cho phù hợp. Tất cả các cách đều có chung một cấu trúc đó là khai báo field của bảng A và sẽ tham chiếu đến field nào của bảng B bởi từ khóa REFERENCES.

Tạo trong lệnh tạo bảng create table

Chúng ta sẽ tạo trực tiếp trong lệnh tạo bảng và cú pháp của nó cũng tương tự như lệnh tạo khóa chính, nghĩa là sẽ đặt ở cuối phần khai báo field. Nếu sử dụng cách này thì khóa ngoại sẽ không có tên.

Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE Groups (
    groupid INT(11) NOT NULL PRIMARY KEY,
    title INT(11) NOT NULL,
    LEVEL TINYINT(1) DEFAULT 1 NOT NULL
);
 
CREATE TABLE Users(
    userid INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL ,
    email VARCHAR (50) NOT NULL ,
    groupid INT(11),
    FOREIGN KEY (groupid) REFERENCES Groups(groupid)
);

Các bạn thấy tôi đã sử dụng từ khóa FOREIGN KEY (groupid) REFERENCES Groups(groupid) để tạo khóa ngoại, trong đó:

  • FOREIGN KEY (groupid): là field được chọn làm khóa ngoại ở bảng con, tức là bảng Users.
  • REFERENCES Groups(groupid): là khóa chính của bảng cha, tức là bảng Groups.

Sau khi tạo xong bạn vào PHPMyAdmin và chọn mục database, chọn diagram ở thanh công cụ thì lúc này bạn sẽ thấy một sơ đồ như sau:

foreign key mysql png

Như vậy là bạn đã tạo thành công rồi đấy.

Ví dụ có đặt tên:

Tương tự như các phần trước, để đặt tên cho khóa ngoại thì ta phải sử dụng từ khóa CONSTRAINT.

Ví dụ có đặt tên
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE Groups (
    groupid INT(11) NOT NULL PRIMARY KEY,
    title INT(11) NOT NULL,
    LEVEL TINYINT(1) DEFAULT 1 NOT NULL
);
 
CREATE TABLE Users(
    userid INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL ,
    email VARCHAR (50) NOT NULL ,
    groupid INT(11),
    CONSTRAINT fk_group FOREIGN KEY (groupid) REFERENCES Groups(groupid)
);

Tạo bằng lệnh ALTER TABLE

Với cách này ta phải tạo hai bảng trước, sau đó sẽ dùng lệnh ALTER TABLE để thêm FOREIGN KEY.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Groups (
    groupid INT(11) NOT NULL PRIMARY KEY,
    title INT(11) NOT NULL,
    LEVEL TINYINT(1) DEFAULT 1 NOT NULL
);
 
CREATE TABLE Users(
    userid INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL ,
    email VARCHAR (50) NOT NULL ,
    groupid INT(11)
);
 
ALTER TABLE Users ADD FOREIGN KEY(groupid) REFERENCES Groups(groupid);

Hoặc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Groups (
    groupid INT(11) NOT NULL PRIMARY KEY,
    title INT(11) NOT NULL,
    LEVEL TINYINT(1) DEFAULT 1 NOT NULL
);
 
CREATE TABLE Users(
    userid INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR (50) NOT NULL,
    groupid INT(11)
);
 
ALTER TABLE Users ADD CONSTRAINT fk_group FOREIGN KEY(groupid) REFERENCES Groups(groupid);

Tạo khóa ngoại trường hợp tham chiếu chính nó

Trường hợp này ta cũng sử dụng cú pháp tương tự, thay vì tham chiếu tới bảng nào đó thì sẽ tham chiếu đến chính nó.

Ví dụ
1
2
3
4
5
6
7
CREATE TABLE Employee(
    id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    fullname VARCHAR(50) NOT NULL,
    email VARCHAR (50) NOT NULL,
    leader_id INT (11) NOT NULL,
    CONSTRAINT pk_self FOREIGN KEY (leader_id) REFERENCES Employee(id)
);

3. Xóa (DropForeign Key

Để xóa được Foreign Key thì bạn phải biết tên của nó là gì, mà tên chỉ tồn tại trong trường hợp ta có sử dụng từ khóa CONSTRAINT lúc tạo khóa, vì vậy khuyến khích bạn sử dụng CONSTRAINT để tạo khóa ngoại.

Sau đây là cú pháp xóa Foreign Key:

1
ALTER TABLE Users DROP FOREIGN KEY fk_group;

Trong đó fk_group là tên của khóa ngoại.

Lưu ý quan trọng:

Bạn chỉ thực hiện được thao tác xóa khi không tồn tại một bảng con nào tham chiếu đến nó.

4. Lời kết

Trong bài này chủ yếu tìm hiểu định nghĩa của khóa ngoại (Foreign key) và tìm hiểu một số cách tạo khóa ngoại thông dụng, bài này kết thúc tại đây, bài tiếp theo mình sẽ nói về lệnh alter table.

=============================
* 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

=============================
Khóa ngoại (Foreign Key) trong MySQL, 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