- Trong hệ quản trị cơ sở dữ liệu MySQL, ràng buộc FOREIGN KEY (khóa ngoại) được dùng để xây dựng một mối liên kết giữa hai cái bảng nhằm đảm bảo tính "toàn vẹn dữ liệu" của các bảng (khi trong hai cái bảng đó có một cái bảng tham chiếu đến dữ liệu của cái bảng còn lại)
- Ví dụ: Tôi có hai cái bảng Customers & Orders lần lượt như bên dưới:
+ Bảng Customers lưu trữ thông tin của các khách hàng:
ID | Name | Address | City |
---|---|---|---|
1 | Nguyễn Thành Nhân | 63 Hoàng Văn Thụ | Cần Thơ |
2 | Dương Văn Gánh | 16B Nguyễn Văn Cừ | Sóc Trăng |
3 | Trần Thị Huỳnh Như | 365A Trần Quang Diệu | Vĩnh Long |
+ Bảng Orders lưu trữ thông tin về các đơn đặt hàng của những khách hàng trong cái bảng Customers:
ID | OrderDate | CustomerID |
---|---|---|
1 | 2019-08-05 | 1 |
2 | 2019-09-17 | 2 |
3 | 2019-10-22 | 2 |
4 | 2019-11-08 | 3 |
- Cột CustomerID trong bảng Orders tham chiếu dữ liệu từ cột ID trong cái bảng Customers, nó cho chúng ta biết những khách hàng nào đã đặt những đơn hàng nào (nếu chúng ta thêm vào cái bảng Order những đơn hàng mà ID của các khách hàng không tồn tại thì những đơn hàng đó sẽ trở nên không hợp lệ)
- Để tránh việc bảng Orders bị chứa những đơn hàng không hợp lệ thì chúng ta cần phải thiết lập ràng buộc FOREIGN KEY cho cột CustomerID, ràng buộc này đảm bảo việc ngăn chặn những hành động không hợp lệ, điển hình như:
+ Không cho phép thêm những đơn hàng mà ID của khách hàng không tồn tại trong bảng Customers.
+ Không cho phép xóa những khách hàng mà ID của họ có tồn tại trong bảng Orders.
+ Không cho phép xóa bảng Customers khi bảng Orders vẫn còn đang tồn tại.
. . . .
- Trong hai cái bảng, bảng chứa ràng buộc FOREIGN KEY (khóa ngoại) được gọi là bảng con, còn bảng chứa khóa chính thì được gọi là bảng tham chiếu hoặc bảng cha (điển hình như trong ví dụ phía trên, bảng Orders được gọi là bảng con, bảng Customers được gọi là bảng tham chiếu)
- Để tạo một ràng buộc FOREIGN KEY thì chúng ta sử dụng cú pháp như sau:
- Mã: Chọn tất cả
CONSTRAINT tên_ràng_buộc FOREIGN KEY (column1) REFERENCES table_name(column2)
- Trong đó:
+ column1 là tên của cái cột (bên trong bảng con) mà các bạn muốn thiết lập ràng buộc FOREIGN KEY.
+ table_name là tên của cái bảng tham chiếu.
+ column2 là tên của cái cột (bên trong bảng tham chiếu) mà cột column1 tham chiếu đến, ngoài ra column2 còn phải là khóa chính (PRIMARY KEY) của cái bảng tham chiếu.
- Chúng ta có thể thêm một trong các tùy chọn sau vào cuối cú pháp khi tạo ràng buộc FOREIGN KEY:
- Mã: Chọn tất cả
CONSTRAINT tên_ràng_buộc FOREIGN KEY (column1) REFERENCES table_name(column2)
ON UPDATE CASCADE
- Mã: Chọn tất cả
CONSTRAINT tên_ràng_buộc FOREIGN KEY (column1) REFERENCES table_name(column2)
ON DELETE CASCADE
+ RESTRICT : Chọn hạn chế xóa có nghĩa là MySQL sẽ từ chối xóa bản ghi trong customer nếu nó được tham chiếu bởi một bản ghi khác trong orders. Để xóa một bản ghi trong customer, trước tiên bạn sẽ phải xóa tất cả các bản ghi nào được ràng buộc khóa ngoại khỏi orders. Chỉ sau đó, bạn mới có thể xóa bản ghi trong customer. Đây là hành động mặc định.
+ CASCADE : Chọn tùy chọn cascade có nghĩa là khi chúng ta xóa bản ghi trong customer, các bản ghi tham chiếu đến nó trong orders cũng bị xóa. Điều này hữu ích trong nhiều trường hợp nhưng phải sử dụng cẩn thận để tránh xóa nhầm dữ liệu
+ NO ACTION : Mặc dù một số hệ thống cơ sở dữ liệu khác cho phép bạn trì hoãn kiểm tra với tùy chọn NO ACTION, nhưng trong MySQL điều này tương đương với RESTRICT. Hệ thống sẽ từ chối yêu cầu cập nhật hoặc xóa bản ghi có ràng buộc khóa ngoại
+ SET NULL : Tùy chọn này yêu cầu MySQL đặt các cột tham chiếu thành NULL tại thời điểm các bản ghi được tham chiếu bị xóa. Vì vậy, nếu chúng ta xóa một bản ghi trong customer, giá trị tham chiếu trong bản ghi orders sẽ được đặt thành NULL.
+ SET DEFAULT : Mặc dù một số hệ thống cơ sở dữ liệu khác cho phép bạn đặt giá trị mặc định các cột tham chiếu trong trường hợp xóa hoặc cập nhật bản ghi tham chiếu, nhưng MySQL hiện tại không cho phép thực hiện hành động này (hiện tại SET DEFAULT chưa được hỗ trợ trong MySQL)
- Ví dụ: Dưới đây là đoạn mã dùng để tạo hai cái bảng Customers & Orders giống như trong ví dụ phía trên:
- Mã: Chọn tất cả
CREATE TABLE Customers(
ID INT PRIMARY KEY,
Name VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);
CREATE TABLE Orders(
ID INT PRIMARY KEY,
OrderDate DATE,
CustomerID INT,
CONSTRAINT lien_ket_01 FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
);
2. Thêm ràng buộc FOREIGN KEY (khi bảng đã được tạo)
- Đối với trường hợp bảng đã được tạo trước, nhưng do quên thiết lập ràng buộc FOREIGN KEY cho cột nên bây giờ các bạn muốn bổ sung, để làm được điều đó thì sử dụng lệnh chỉnh sửa bảng như bên dưới:
- Mã: Chọn tất cả
ALTER TABLE table1 ADD CONSTRAINT tên_ràng_buộc FOREIGN KEY (column1) REFERENCES table2(column2);
- Ví dụ:
- Mã: Chọn tất cả
ALTER TABLE Orders
ADD CONSTRAINT lien_ket_01 FOREIGN KEY (CustomerID) REFERENCES Customers(ID);
3. Cách xóa ràng buộc FOREIGN KEY
- Dưới đây là cú pháp dùng để xóa một ràng buộc FOREIGN KEY:
- Mã: Chọn tất cả
ALTER TABLE table_name DROP FOREIGN KEY tên_ràng_buộc;
- Ví dụ, để xóa ràng buộc FOREIGN KEY có tên là lien_ket_01 (trên bảng Orders) thì tôi sử dụng câu lệnh sau:
- Mã: Chọn tất cả
ALTER TABLE Orders DROP FOREIGN KEY lien_ket_01;
4. Tài liệu tham khảo
https://webcoban.vn/mysql/foreign-key-k ... rong-mysql