Khóa ngoại (FOREIGN KEY) trong Mysql

Khóa ngoại (FOREIGN KEY) là cách thức để tạo mối quan hệ dữ liệu giữa các bảng trong database. Trong bài viết này unitop hướng dẫn bạn tìm hiểu nguyên lý hoạt động, cách thiết lập khóa ngoại trong hệ quản trị Mysql.

Khóa ngoại Foreign key trong Mysql là gì?

Trước khi đi vào thực hành, chúng ta đi qua khái niệm.

Khóa ngoại (Foreign Key) trong MySQL là một ràng buộc dùng để xác định mối quan hệ giữa hai bảng trong cơ sở dữ liệu.

Khóa ngoại được sử dụng để đảm bảo tính toàn vẹn và liên kết dữ liệu giữa các bảng.

Nó định nghĩa một mối quan hệ giữa bảng cha (primary key) và bảng con (foreign key) để đảm bảo rằng dữ liệu trong bảng con phụ thuộc vào dữ liệu trong bảng cha.

Ví dụ quan hệ giữa bảng orders và bảng customers trong website bán hàng.

Tác dụng của khóa ngoại trong dữ liệu

Việc thiết lập khóa ngoại (foreign key) trong cơ sở dữ liệu có nhiều tác dụng quan trọng:

  1. Đảm bảo tính toàn vẹn dữ liệu: Khóa ngoại đảm bảo tính toàn vẹn dữ liệu bằng cách đảm bảo rằng mối quan hệ giữa các bảng được duy trì. Nó ngăn chặn việc chèn hoặc cập nhật dữ liệu không hợp lệ trong bảng con, bảo vệ sự nhất quán của cơ sở dữ liệu.
  2. Quản lý mối quan hệ giữa các bảng: Khóa ngoại giúp quản lý mối quan hệ giữa các bảng trong cơ sở dữ liệu. Nó cho phép bạn liên kết dữ liệu từ các bảng khác nhau dựa trên cột khóa ngoại, giúp truy vấn và thu thập thông tin từ nhiều bảng dễ dàng.
  3. Hành vi xóa và cập nhật kiểm tra: Thông qua tùy chọn ON DELETE và ON UPDATE, bạn có thể xác định hành vi khi xóa hoặc cập nhật bản ghi trong bảng cha. Điều này giúp bạn quản lý cách dữ liệu trong bảng con phản ánh thay đổi trong bảng cha. Ví dụ, bạn có thể xóa tất cả các bản ghi con khi xóa một bản ghi cha (CASCADE) hoặc đặt các cột khóa ngoại trong bảng con thành NULL khi xóa bản ghi cha (SET NULL).
  4. Ngăn chặn dữ liệu không hợp lệ: Khóa ngoại ngăn chặn dữ liệu không hợp lệ từ được chèn vào bảng con. Điều này đảm bảo rằng chỉ dữ liệu hợp lệ và thỏa mãn ràng buộc sẽ được thêm vào bảng con, giúp bảo vệ tính toàn vẹn dữ liệu.
  5. Duyệt qua và thực hiện các thao tác dữ liệu liên quan: Mối quan hệ khóa ngoại giúp bạn dễ dàng duyệt qua và thực hiện các thao tác dữ liệu liên quan. Ví dụ, bạn có thể lấy tất cả các đơn đặt hàng của một khách hàng cụ thể, tính tổng giá trị đơn đặt hàng của họ hoặc tìm tất cả các đơn đặt hàng liên quan đến một sản phẩm cụ thể.

Tóm lại, việc thiết lập khóa ngoại trong cơ sở dữ liệu là một cách quan trọng để đảm bảo tính toàn vẹn dữ liệu, quản lý mối quan hệ giữa các bảng và thực hiện các thao tác dữ liệu liên quan một cách hiệu quả và an toàn.

Ví dụ về khóa ngoại trong thực tế

Hãy xem xét một ví dụ về mối quan hệ khóa ngoại giữa hai bảng “orders” và “customers” trong một dự án cơ sở dữ liệu đơn giản. Trong ví dụ này, “orders” là bảng con, và “customers” là bảng cha. Mỗi đơn đặt hàng (order) phải liên kết với một khách hàng (customer).

Bảng “customers” :

+-------------+-----------+------------------+
| customer_id | name      | email            |
+-------------+-----------+------------------+
| 1           | John Doe  | john@example.com |
| 2           | Jane Smith| jane@example.com |
| 3           | Bob Brown | bob@example.com  |
+-------------+-----------+------------------+

Bảng "orders":
+----------+-------------+------------+----------------+
| order_id | customer_id | order_date | total_amount   |
+----------+-------------+------------+----------------+
| 1001     | 1           | 2023-10-01 | 100000         |
| 1002     | 1           | 2023-10-02 | 750000         |
| 1003     | 2           | 2023-10-03 | 200000         |
| 1004     | 3           | 2023-10-04 | 1000000        |
| 1005     | 2           | 2023-10-05 | 1280000        |
+----------+-------------+------------+----------------+

Trong ví dụ này:

  • Bảng “customers” chứa thông tin về ba khách hàng: John Doe, Jane Smith và Bob Brown.
  • Bảng “orders” chứa thông tin về các đơn đặt hàng của khách hàng. Ví dụ, đơn đặt hàng có mã “1001” thuộc về khách hàng John Doe, đơn đặt hàng có mã “1003” thuộc về khách hàng Jane Smith, và đơn đặt hàng có mã “1004” thuộc về khách hàng Bob Brown.
  • Cột “customer_id” trong bảng “orders” tham chiếu đến cột “customer_id” trong bảng “customers,” thiết lập mối quan hệ khóa ngoại giữa chúng.

Mối quan hệ này cho phép bạn xác định rõ ràng rằng đơn đặt hàng nào thuộc về khách hàng nào. Bạn có thể sử dụng các truy vấn SQL để lấy thông tin đơn đặt hàng của từng khách hàng hoặc thực hiện các thao tác khác trên dữ liệu dựa trên mối quan hệ này.

Cách thiết lập khóa ngoại

Để thiết lập khóa ngoại trong MySQL, bạn cần sử dụng câu lệnh FOREIGN KEY khi tạo hoặc chỉnh sửa bảng. Dưới đây là các bước cụ thể để thiết lập khóa ngoại:

Tạo bảng cha (Primary Table): Đầu tiên, bạn cần tạo bảng cha, nơi bạn muốn có khóa chính (primary key) mà các bảng con sẽ tham chiếu đến. Ví dụ:

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255)
);

Tạo bảng con (Child Table): Sau đó, tạo bảng con mà bạn muốn có khóa ngoại (foreign key) để tham chiếu đến bảng cha. Ví dụ:

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  total_amount INT
);

Thiết lập Khóa Ngoại: Bây giờ, sử dụng câu lệnh ALTER TABLE để thêm khóa ngoại vào bảng con. Câu lệnh này định nghĩa ràng buộc khóa ngoại và tham chiếu đến bảng cha. Ví dụ:

ALTER TABLE orders
ADD CONSTRAINT fk_customer_id
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id);

Trong ví dụ này:

  • fk_customer_id là tên của ràng buộc khóa ngoại (có thể tự đặt tên tùy ý).
  • FOREIGN KEY (customer_id) chỉ ra cột trong bảng con mà bạn muốn làm khóa ngoại.
  • REFERENCES customers(customer_id) xác định bảng cha và cột khóa chính mà bạn muốn tham chiếu.

Bạn có thể hiết lập khóa ngoại ngay khi tạo bảng con.

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  total_amount INT,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Tùy chọn ON DELETE khi thiết lập khóa ngoại

Lựa chọn tùy chọn ON DELETE nên phụ thuộc vào mục tiêu và yêu cầu cụ thể của ứng dụng cơ sở dữ liệu của bạn. Dưới đây là một số tùy chọn phù hợp với một số tình huống cụ thể:

  1. RESTRICT: Sử dụng RESTRICT khi bạn muốn ngăn chặn việc xóa hoặc cập nhật các bản ghi trong bảng cha nếu tồn tại các bản ghi con tham chiếu đến chúng. Điều này có thể là tùy chọn an toàn để đảm bảo tính toàn vẹn dữ liệu, nhưng bạn cần phải quản lý các xử lý lỗi khi cố gắng xóa hoặc cập nhật các bản ghi cha có liên kết với bản ghi con.
  2. CASCADE: Sử dụng CASCADE khi bạn muốn tự động xóa hoặc cập nhật các bản ghi trong bảng con khi có sự thay đổi trong bảng cha. Điều này hữu ích khi bạn muốn duyệt qua và cập nhật dữ liệu bảng con liên quan mà không cần thực hiện điều này thủ công. Tuy nhiên, bạn cần cẩn thận để không gây ra sự mất mát dữ liệu không mong muốn.
  3. SET NULL: Sử dụng SET NULL khi bạn muốn đặt các cột khóa ngoại trong bảng con thành NULL khi bản ghi cha được xóa hoặc cập nhật. Điều này hữu ích khi bạn muốn giữ lại dữ liệu trong bảng con và cho phép các bản ghi con không có khóa ngoại hợp lệ. Tuy nhiên, bạn cần kiểm tra và xử lý các giá trị NULL trong ứng dụng của bạn.
  4. NO ACTION: Sử dụng NO ACTION nếu bạn muốn ngăn chặn xóa hoặc cập nhật các bản ghi trong bảng cha khi tồn tại các bản ghi con tham chiếu đến chúng, tương tự như RESTRICT. Nó là tùy chọn mặc định và ngăn chặn các hành động không mong muốn.

Lựa chọn tùy chọn ON DELETE cần xem xét cẩn thận và phụ thuộc vào logic kết nối dữ liệu của bạn và cách bạn muốn xử lý các thay đổi trong cơ sở dữ liệu.

Thực hành thiết lập khóa ngoại trên Phpmyadmin

Lưu ý: Trong hướng dẫn này, tôi sẽ sử dụng ví dụ về bảng “orders” và bảng “customers” như đã nêu trong các câu trả lời trước đó.

  1. Đăng nhập vào phpMyAdmin: Đăng nhập vào giao diện quản trị cơ sở dữ liệu MySQL bằng tài khoản quản trị.
  2. Chọn Cơ Sở Dữ Liệu: Chọn cơ sở dữ liệu mà bạn muốn thêm khóa ngoại. Bạn có thể làm điều này bằng cách nhấp vào tên cơ sở dữ liệu trong bảng bên trái.
  3. Tạo Bảng Cha (Primary Table): Trước tiên, bạn cần tạo bảng cha nơi bạn muốn có khóa chính (primary key). Trong ví dụ này, tôi đã tạo bảng “customers.” Để tạo bảng, bạn có thể sử dụng trình quản lý SQL hoặc giao diện phpMyAdmin.
  4. Tạo Bảng Con (Child Table): Tiếp theo, tạo bảng con nơi bạn muốn thêm khóa ngoại. Trong ví dụ này, tôi đã tạo bảng “orders.”
  5. Chỉnh Sửa Bảng Con (Child Table): Nhấp vào tên bảng con (trong ví dụ, “orders”) để chỉnh sửa bảng.
  6. Thêm Cột Khóa Ngoại (Foreign Key Column): Trong trình chỉnh sửa bảng, thêm cột khóa ngoại vào bảng con. Trong ví dụ này, tôi thêm cột “customer_id” để lưu khóa ngoại.
  7. Thêm Khóa Ngoại (Foreign Key Constraint): Sau đó, để thêm khóa ngoại, bạn cần nhấp vào tab “Indexes” hoặc “Structure” (tên có thể thay đổi dựa trên phiên bản phpMyAdmin). Tìm đến phần “Indexes” hoặc “Key” và thêm một key mới. Đặt tên cho khóa ngoại (ví dụ: “fk_customer_id”).
  8. Cấu hình Khóa Ngoại:
    • Chọn cột “customer_id” trong bảng con mà bạn muốn làm khóa ngoại.
    • Trong phần “Foreign key”, chọn bảng cha (ví dụ: “customers”) và cột khóa chính (ví dụ: “customer_id”) mà bạn muốn tham chiếu.
    • Cấu hình tùy chọn ON DELETE và ON UPDATE nếu cần.
  9. Lưu Cấu Hình: Sau khi cấu hình khóa ngoại, nhấp vào nút “Save” hoặc “Go” để lưu thay đổi.
  10. Hoàn Thành: Bây giờ, bạn đã thiết lập khóa ngoại giữa bảng “orders” và “customers.” Bất kỳ thay đổi dữ liệu nào trong cơ sở dữ liệu phải tuân theo ràng buộc khóa ngoại mà bạn đã thiết lập.

Lưu ý rằng quy trình này có thể thay đổi một chút dựa trên phiên bản cụ thể của phpMyAdmin, nhưng ý tưởng chính là tạo cột khóa ngoại trong bảng con và sau đó cấu hình nó để tham chiếu đến bảng cha.

Cách xóa khóa ngoại trong mysql

Để xóa một khóa ngoại (foreign key) trong MySQL, bạn cần sử dụng câu lệnh ALTER TABLE. Dưới đây là cách để xóa một khóa ngoại:

  1. Xác định tên bảng chứa khóa ngoại và tên khóa ngoại mà bạn muốn xóa.
  2. Sử dụng câu lệnh ALTER TABLE để xóa khóa ngoại bằng cách sử dụng từ khóa DROP FOREIGN KEY:
ALTER TABLE ten_bang
DROP FOREIGN KEY ten_khoa_ngoai;

Ví dụ: Nếu bạn muốn xóa khóa ngoại có tên “fk_order_customer” từ bảng “orders”, bạn có thể làm như sau:

ALTER TABLE orders
DROP FOREIGN KEY fk_order_customer;

Lưu ý rằng việc xóa khóa ngoại có thể ảnh hưởng đến tính toàn vẹn dữ liệu, vì vậy hãy đảm bảo rằng bạn đang thực hiện việc này một cách cẩn thận.

Kết luận

Các bảng dữ liệu trong dự án thường có một hoặc nhiều mối liên kết với nhau. Qua bài này bạn được chia sẻ về cách thiết lập khóa ngoại từ đó giúp dữ liệu được nhất quán, toàn vẹn và hạn chế dữ liệu rác trong hệ thống.

Hành động của bạn ngay bây giờ cần thực hành để hiểu cách thiết lập và sử dụng khóa ngoại trong dự án.

*** Bạn đang có mục tiêu học lập trình web backend đi làm nhưng đang tự học học mò mẫm không hiệu quả dẫn đến chán nản? Tin vui, tôi có lộ trình học php chuyên sâu giúp bạn hoàn thiện kỹ năng lập trình web và tạo thu nhập 8-30tr/tháng.

✌️Click xem Php Master và nâng cấp tư duy, kỹ năng của bạn ngay bây giờ!

P/s: Đặc biệt được kèm cặp hỗ trợ qua nhóm kín trong suốt quá trình đến khi đi làm!

Từ khóa liên quan:

  • Tạo khóa ngoại trong MySQL phpmyadmin
  • Xóa khóa ngoại trong MySQL
  • Tạo khóa ngoại trong MySQL XAMPP
  • Foreign key MySQL
  • Tạo relationship trong phpMyAdmin
  • Cách kiểm tra khóa ngoại trong SQL
  • Tạo khóa ngoại trong SQL

Đề xuất cho bạn

Subscribe
Notify of
guest

0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments

Tặng Ebook chia sẻ kinh nghiệm học lập trình web đi làm cho người mới bắt đầu!

Đây là tấm bản đồ chia sẻ lại cách học lập trình web đi làm đã giúp nhiều học trò của unitop kiếm được thu nhập từ 8-30tr mỗi tháng.

Ebook Bí quyết học lập trình web đi làm - Phan Văn Cương - Unitop.vn
0
Bạn đang nghĩ gì? Hãy để lại bình luận tại đâyx
()
x