Site logo
Authors
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Published on
Published on

Tìm hiểu khóa ngoại trong MySQL

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ phổ biến, cung cấp khả năng quản lý mối quan hệ giữa các bảng. Một tính năng quan trọng trong MySQL là khóa ngoại (foreign key), giúp đảm bảo tính toàn vẹn dữ liệu giữa các bảng. Trong bài viết này, chúng ta sẽ tìm hiểu khóa ngoại là gì, cách sử dụng, và vai trò của ràng buộc ON DELETE trong việc duy trì tính nhất quán của cơ sở dữ liệu.

Khóa Ngoại Trong MySQL Là Gì?

Khóa ngoại là một cột (hoặc tập hợp các cột) trong một bảng, tham chiếu đến khóa chính của một bảng khác. Nó thiết lập mối liên kết giữa hai bảng, đảm bảo rằng giá trị trong cột khóa ngoại phải khớp với giá trị trong cột tham chiếu.

Ví Dụ Về Khóa Ngoại

Xem xét hai bảng: usersorders.

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Ở đây, cột user_id trong bảng orders là một khóa ngoại tham chiếu đến cột id trong bảng users.

Tại Sao Cần Sử Dụng Khóa Ngoại?

Khóa ngoại đảm bảo tính toàn vẹn dữ liệu bằng cách:

  • Ngăn không cho dữ liệu không hợp lệ được chèn vào cột khóa ngoại.
  • Tự động thực hiện các thay đổi đối với các hàng liên quan khi dữ liệu tham chiếu được cập nhật hoặc xóa (tùy thuộc vào quy tắc ràng buộc).

Demo Insert Dữ Liệu Không Hợp Lệ.

-- Chèn dữ liệu
INSERT INTO users (name) VALUES ('XinhND');

-- Cố gắng thêm người dùng không tồn tại vào orders
INSERT INTO orders (user_id) VALUES (99);
-- Lỗi: Cannot add or update a child row: a foreign key constraint fails (`test2`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))

Ràng Buộc ON DELETE Là Gì?

Câu lệnh ON DELETE xác định hành động cần thực hiện khi một hàng tham chiếu trong bảng cha bị xóa. MySQL hỗ trợ các tùy chọn sau:

  1. ON DELETE CASCADE Xóa các hàng trong bảng con liên kết với hàng bị xóa trong bảng cha.
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

Nếu một người dùng bị xóa khỏi bảng users, tất cả các đơn hàng của họ trong bảng orders cũng sẽ bị xóa.

  1. ON DELETE SET NULLGán giá trị NULL cho cột khóa ngoại trong bảng con khi hàng tham chiếu trong bảng cha bị xóa.
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL

Nếu một người dùng bị xóa, các đơn hàng của họ sẽ được giữ lại, nhưng cột user_id trong bảng orders sẽ được đặt thành NULL.

  1. ON DELETE RESTRICT Ngăn không cho xóa một hàng trong bảng cha nếu nó có các hàng phụ thuộc trong bảng con.
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT

Trong MySQL, nếu bạn không chỉ định ràng buộc ON DELETE khi tạo khóa ngoại, giá trị mặc định là RESTRICT. Nếu bạn cố gắng xóa một người dùng có đơn hàng, một lỗi sẽ xảy ra.

-- Chèn dữ liệu
INSERT INTO users (name) VALUES ('Bill');

-- Cố gắng xóa người dùng có đơn hàng
DELETE FROM users WHERE id = 1;
-- Lỗi: Cannot delete or update a parent row: a foreign key constraint fails
  1. ON DELETE NO ACTIONTương tự như RESTRICT, nhưng hành động này được hoãn lại cho đến khi kết thúc Transaction.5. ON DELETE SET DEFAULT Gán giá trị mặc định (nếu được chỉ định) cho cột khóa ngoại khi hàng tham chiếu bị xóa.

Lưu ý : MySQL hiện không hỗ trợ SET DEFAULT tính đến phiên bản 8.0.

Khi Nào Sử Dụng Mỗi Loại Ràng Buộc ON DELETE?

Việc lựa chọn ràng buộc ON DELETE phụ thuộc vào logic ứng dụng của bạn:

  • Sử dụng CASCADE nếu bạn muốn các bản ghi phụ thuộc tự động bị xóa.
  • Sử dụng SET NULL khi cần giữ lại bản ghi phụ thuộc nhưng loại bỏ liên kết.
  • Sử dụng RESTRICT hoặc NO ACTION để bảo toàn tính toàn vẹn dữ liệu và ngăn ngừa việc xóa nhầm.

Best Practice Khi Sử Dụng Khóa Ngoại và Ràng Buộc

  1. Lên Kế Hoạch Quan Hệ Cẩn Thận : Hiểu rõ mối quan hệ giữa các bảng để chọn ràng buộc ON DELETE phù hợp.
  2. Tránh Lạm Dụng : Sử dụng khóa ngoại và ràng buộc một cách hợp lý để tránh làm phức tạp thiết kế cơ sở dữ liệu.
  3. Sử Dụng Transaction : Khi thực hiện các thao tác phức tạp, hãy sử dụng Transaction để đảm bảo tính nhất quán.

Kết Luận

Khóa ngoại và ràng buộc ON DELETE là công cụ quan trọng để duy trì tính toàn vẹn dữ liệu và đơn giản hóa các thao tác cơ sở dữ liệu. Bằng cách hiểu rõ hành vi của chúng và lựa chọn ràng buộc phù hợp với từng trường hợp, bạn có thể thiết kế các lược đồ cơ sở dữ liệu mạnh mẽ, đáp ứng các quy tắc kinh doanh hiệu quả. Nếu bạn thấy bài viết hữu ích, hãy chia sẻ với bạn bè và đón chờ những mẹo cơ sở dữ liệu khác!

Liên kết tham khảo