MySQL Foreign Key
http://www.mysqltutorial.org/mysql-foreign-key
Last updated
http://www.mysqltutorial.org/mysql-foreign-key
Last updated
Cú pháp sau minh họa cách xác định khóa ngoại trong bảng con trong câu lệnh CREATE TABLE.
Mệnh đề CONSTRAINT cho phép bạn xác định tên ràng buộc cho ràng buộc khóa ngoài. Nếu bạn bỏ qua nó, MySQL sẽ tự động tạo một tên.
Mệnh đề FOREIGN KEY chỉ định các cột trong bảng con tham chiếu đến các cột khóa chính trong bảng cha. Bạn có thể đặt tên khóa ngoại sau mệnh đề FOREIGN KEY hoặc để lại để MySQL tạo tên cho bạn. Lưu ý rằng MySQL tự động tạo một chỉ mục với tên foreign_key_name.
Mệnh đề REFERENCES chỉ định bảng cha và các cột mà các cột trong bảng con tham chiếu. Số lượng cột trong bảng con và bảng cha được chỉ định trong FOREIGN KEY và REFERENCES phải giống nhau.
Mệnh đề ON DELETE cho phép bạn xác định những gì xảy ra với các bản ghi trong bảng con khi các bản ghi trong bảng cha bị xóa. Nếu bạn bỏ qua mệnh đề ON DELETE và xóa một bản ghi trong bảng cha có các bản ghi trong bảng con tham chiếu, MySQL sẽ từ chối xóa. Ngoài ra, MySQL cũng cung cấp cho bạn các hành động để bạn có thể có các tùy chọn khác, chẳng hạn như ON DELETE CASCADE yêu cầu MySQL xóa các bản ghi trong bảng con tham chiếu đến một bản ghi trong bảng cha khi bản ghi trong bảng cha bị xóa. Nếu bạn không muốn xóa các bản ghi liên quan trong bảng con, bạn sử dụng hành động ON DELETE SET NULL để thay thế. MySQL sẽ đặt các giá trị cột khóa ngoài trong bảng con thành NULL khi bản ghi trong bảng cha bị xóa, với điều kiện cột khóa ngoài trong bảng con phải chấp nhận giá trị NULL. Lưu ý rằng nếu bạn sử dụng ON DELETE NO ACTION hoặc ON DELETE RESTRICT action, MySQL sẽ từ chối xóa.
Mệnh đề ON UPDATE cho phép bạn chỉ định những gì xảy ra với các hàng trong bảng con khi các hàng trong bảng cha được cập nhật. Bạn có thể bỏ qua mệnh đề ON UPDATE để cho phép MySQL từ chối mọi cập nhật cho các hàng trong bảng con khi các hàng trong bảng cha được cập nhật. Hành động ON UPDATE CASCADE cho phép bạn thực hiện cập nhật bảng chéo và hành động ON UPDATE SET NULL đặt lại các giá trị trong các hàng trong bảng con thành giá trị NULL khi các hàng trong bảng cha được cập nhật. The ON UPDATE NO ACTION hoặc UPDATE RESTRICT từ chối mọi cập nhật.
Ví dụ sau đây tạo ra một cơ sở dữ liệu dbdemo và hai bảng: categories và products. Mỗi danh mục có một hoặc nhiều sản phẩm và mỗi sản phẩm chỉ thuộc về một danh mục. Trường cat_id trong bảng sản phẩm được xác định là khóa ngoại với UPDATE ON CASCADE and DELETE ON RESTRICT actions.
Để thêm khóa ngoại vào bảng hiện có, bạn sử dụng câu lệnh ALTER TABLE với cú pháp định nghĩa khóa ngoại ở trên:
Bây giờ, hãy để thêm một bảng mới có tên vendors và thay đổi bảng products để bao gồm trường id nhà cung cấp:
Để thêm khóa ngoại vào bảng sản phẩm, bạn sử dụng câu lệnh sau:
Bây giờ, bảng products có hai khóa ngoại, một liên quan đến bảng danh mục và một khóa khác đề cập đến bảng vendors.
In the statement above:
Đầu tiên, bạn chỉ định tên bảng mà bạn muốn xóa khóa ngoại.
Thứ hai, bạn đặt tên ràng buộc sau mệnh đề DROP FOREIGN KEY.
Lưu ý rằng ràng buộc là tên của ràng buộc được chỉ định khi bạn tạo hoặc thêm khóa ngoại vào bảng. Nếu bạn bỏ qua nó, MySQL sẽ tạo một tên ràng buộc cho bạn.
Để có được tên ràng buộc được tạo của bảng, bạn sử dụng câu lệnh SHOW CREATE TABLE như sau:
Đôi khi, rất hữu ích để vô hiệu hóa kiểm tra khóa ngoài, ví dụ: khi bạn nhập dữ liệu từ tệp CSV vào bảng. Nếu bạn không thể vô hiệu hóa kiểm tra khóa ngoại, bạn phải tải dữ liệu theo một thứ tự thích hợp, tức là bạn phải tải dữ liệu vào các bảng cha trước rồi đến các bảng con, có thể rất tẻ nhạt. Tuy nhiên, nếu bạn vô hiệu hóa kiểm tra khóa ngoại, bạn có thể tải dữ liệu theo bất kỳ đơn hàng nào.
Một ví dụ khác là, trừ khi bạn vô hiệu hóa kiểm tra khóa ngoại, bạn không thể bỏ bảng được tham chiếu bởi ràng buộc khóa ngoài. Khi bạn thả bảng, mọi ràng buộc mà bạn đã xác định cho bảng cũng sẽ bị xóa.
Trong hướng dẫn này, chúng tôi đã đề cập rất nhiều về khóa ngoại của MySQL. Chúng tôi cũng giới thiệu cho bạn một số câu lệnh rất tiện dụng cho phép bạn quản lý khóa ngoại hiệu quả trong MySQL.