Skip to content

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

Trong bài này chúng ta tìm hiểu cách tạo khóa ngoại trong mysql nhé.Khóa ngoại hay còn gọi là Foreign Key.Ở những bài trước, chúng ta đã biết cách tạo ra bảng, tạo khóa chính trong MySQL.Nếu bạn nào chưa tìm hiểu những bài trên vui lòng học kỹ trước kho chuyển sang bài này.

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

Khi chúng ta tạo ra một bảng, thì chỉ lấy được thông tin của duy nhất bảng đó.Tuy nhiên một số trường hợp cần liên kết giữa các bảng lại với nhau để lấy thông tin của 2 hoặc nhiều bảng.Lúc này chúng ta sử dụng khóa ngoại để nối bảng, lấy những thông tin cần thiết giữa các bảng.

Chúng ta hãy nhìn vào sơ đồ cơ sở dữ liệu sau đây : 

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

 

Tôi có hai bảng: customers(khách hàng) orders(đơn hàng).Mỗi khách hàng có không hoặc nhiều đơn hàng và mỗi đơn đặt hàng chỉ thuộc về một khách hàng.Mối quan hệ giữa bảng customers và bảng orders là một-nhiều, và nó được thiết lập bởi một khoá ngoại trong bảng orders là trường customerNumber. Trường customerNumber trong bảng orders liên quan đến customerNumber là khóa chính của bảng customers.

Bảng Customers được gọi là bảng cha hoặc bảng tham chiếu , và bảng orders được gọi là bảng con hoặc bảng tham khảo.Bởi lẽ một khách hàng có thể có nhiều hóa đơn.

Một bảng có thể có nhiều hơn một khoá ngoại, và mỗi khoá ngoại trong bảng con có thể tham chiếu đến một bảng cha khác.

Một hàng trong bảng con phải chứa các giá trị tồn tại trong bảng cha.Ví dụ, mỗi bản ghi lệnh trong bảng orders phải có một giá trị customerNumber tồn tại  trong bảng customers. Nhiều đơn đặt hàng có thể trỏ đến cùng một khách hàng nên vì vậy, mối quan hệ này được gọi là một khách hàng cho nhiều đơn hàng, hoặc một-nhiều.

Tạo khóa ngoại (Foreign Key)  cho bảng

Cú pháp tạo khóa ngoại cho MySQL như sau :


Trong đó : 

REFERENCES : là khai báo field của bảng A tham chiếu đến field của bảng B.Trong ví dụ trên cid của bảng news sẽ tham chiếu đến trường cid – khóa chính của bảng category.

FOREIGN KEY (column) : xác định khóa ngoại của bảng đó.

Sau khi tạo xong bạn vào PHPMYADMIN và chọn như hình :

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

Qúa đó các bạn đã tạo thành công khóa ngoại cho bảng rồi.

Trường hợp các bạn sử dụng khóa ngoại nhưng muốn đặt một tên khác:

Trường hợp các bạn không đặt tên thì mysql sẽ tự động đặt cho các bạn một tên theo quy tắc của mysql.

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ụ:

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.

3. Xóa (Drop) Foreign Key

Khi xóa một khóa ngoại thì các bạn caàn phải biết tên của khóa ngoại bảng đó 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.Tuy nhiên nếu các bạn không đặt tên thì MySQL sẽ tự động đặt tên theo quy tắc của nó cũng như chúng ta cần phải vào tool PHPMYADMIN để xác định tên của nó, chính vì vậy khi tạo khóa ngoại các bạn nên đặt tên để dễ dàng sửa chữa và xóa.

Để đặt tên chúng ta sử dụng CONSTRAINT rất nhiều lần rồi đúng không nhỉ!

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

Một trong những lưu ý quan trọng là khi chúng ta đã tạo khóa ngoại liên kết đến các bảng khác thì khi thực hiện xóa bảng cha các bạn cần xóa bảng con trước rồi mới xóa được bảng cha!

Kết Luận :

Ở bài này chúng ta tìm hiểu về vấn đề cách tạo khóa ngoại (Foreign Key) trong MYSQL .Khi tạo khóa ngoại có rất nhiều cách. Tuy nhiên tùy mỗi bạn lựa chọn cách cho phù hợp nhé. Tạo khóa ngoại chúng ta sử dụng từ khóa FOREIGNKEY.Thông thường chúng ta sử dụng FOREIGNKEY để nối các bảng lại với nhau, truy xuất thông tin cần lấy. Việc xác định khóa chính và khóa ngoại rất quan trọng khi lập trình.

Chúc các bạn thực hiện thành công!

Published inHỌC MYSQL

3 Comments

  1. Google

    We prefer to honor several other internet web pages on the internet, even though they aren’t linked to us, by linking to them. Underneath are some webpages worth checking out.

  2. 537461 62761This really is the suitable weblog for anybody who needs to seek out out about this subject. You notice so significantly its virtually laborious to argue with you (not that I actually would wantHaHa). You undoubtedly put a brand new spin on a topic thats been written about for years. Excellent stuff, just excellent! 593600

  3. 711107 817288I cant say that I completely agree, but then once again Ive never genuinely thought of it quite like that before. Thanks for giving me something to take into consideration when Im supposed to have an empty mind even though trying to fall asleep tonight lol.. 729036

Leave a Reply

Your email address will not be published. Required fields are marked *