29/1/16

Bài 09: Khóa ngoại (Foreign Key) trong MySQL

Chúng ta đã được học các 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ưUNIQUEAUTO_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. Vậy thì trong bài này chúng ta sẽ tìm hiểu sự liên kết giữa hai bảng đó chính là Khóa Ngoại (FOREIGN KEY).

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

Khi học tới bài này rồi thì tôi sẽ không trình bài đến 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 một 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 trong các tất cả các hệ quản trị CSDL. Nếu bạn đã từng học qua các mô hình CSLD thì không còn lạ gì 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).

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

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

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 sẽ 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 customerNumbervà nó sẽ trỏ đến khóa chính (Primary Key) của bảngcustomers.
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:

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 trưởng phòng của nhân viên đó. Hằng ngày các nhân viên 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à nó sẽ tham chiếu tới chính nó luôn. Thông thường trong thực tế thì cũng hay gặp trường hợp này nên các ban 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 danh sách các fields.
Ví dụ không đặ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),
    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 chính, trong đó:
  • FOREIGN KEY (groupid): là field ở bảng Users
  • REFERENCES Groups(groupid): là tham chiếu đến field groupid trong bảng Groups
Sau khi tạo xong bạn vào PHPMYADMIN và chọn database, chọn diagram ở thanh tools bạn sẽ thấy một sơ đồ như sau:

Như vậy là bạn đã tạo thành công rồi đấy.
Ví dụ có đặt tên:
Tương tự các phần trước, để đặt tên thì ta phải sử dụng từ khóa CONSTRAINT.
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),
    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ự, sự khác nhau chỉ là thay vì tham chiếu tới bảng nào đó thì nó tham chiếu đến chính tên bảng của 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 (Drop) Foreign Key

Để xóa được Foreign Key thì bạn phải biết tên của nó là gì, mà tên của nó thì chỉ tồn tại trong trường hợp ta có sử dụng từ khóa CONSTRAINT để tạo. Chính vì vậy khuyến khích bạn sử dụng CONSTRAINTđể tạo khóa ngoại nhé.
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:
Khi bạn thực hiện xóa Table (DROP TABLE) thì nếu bảng đó có một bảng con tham chiếu tới thì bạn phải xóa bảng con trước rồi mới xóa nó được, nếu không sẽ bị báo lỗi ngay, tương tự như khi thực hiện DELETE(sẽ được học sau).

# Lời kết

Trong bài này chủ yếu tìm hiểu định nghĩa Khóa ngoại (Foreign key) là gì và tìm hiểu một số cách tạo khóa ngoại thông dụng, cách tạo khóa ngoại cho một bảng và cho nhiều bảng. Thông thường khi làm việc với các ứng dụng web thì ta ít khi sử dụng khóa ngoại bởi vì sẽ rất chậm, vì vậy người ta sẽ cố gắng thiết kế CSDL làm sao tối ưu để không tồn tại khóa ngoại.
Nguồn: (code.freetuts.net)
Bạn đang đọc bài viết Bài 09: Khóa ngoại (Foreign Key) trong MySQL tại Website: Học Lập Trình

0 nhận xét: