MySQL Foreign Key

http://www.mysqltutorial.org/mysql-foreign-key

Creating foreign keys for tables

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.

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

  • 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.

MYSQL creating table foreign key example

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.

CREATE DATABASE IF NOT EXISTS dbdemo; 
USE dbdemo;
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

Adding a foreign key to a table

Để 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:

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;

MySQL adding foreign key example

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:

USE dbdemo;
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

Để thêm khóa ngoại vào bảng sản phẩm, bạn sử dụng câu lệnh sau:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

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.

Dropping MySQL foreign key

Bạn cũng sử dụng câu lệnh ALTER TABLE để thả khóa ngoại như câu lệnh sau:
ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name;
In the statement above:

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:

SHOW CREATE TABLE products;
Sau đây là đầu ra của câu lệnh:
CREATE TABLE products (
  prd_id int(11) NOT NULL AUTO_INCREMENT,
  prd_name varchar(355) NOT NULL,
  prd_price decimal(10,0) DEFAULT NULL,
  cat_id int(11) NOT NULL,
  vdr_id int(11) NOT NULL,
  PRIMARY KEY (prd_id),
  KEY fk_cat (cat_id),
  KEY fk_vendor(vdr_id),
  CONSTRAINT products_ibfk_2 
  FOREIGN KEY (vdr_id) 
  REFERENCES vendors (vdr_id) 
  ON DELETE NO ACTION 
  ON UPDATE CASCADE,
  CONSTRAINT products_ibfk_1 
  FOREIGN KEY (cat_id) 
  REFERENCES categories (cat_id) 
  ON UPDATE CASCADE
) ENGINE=InnoDB;
Bảng sản phẩm có hai ràng buộc khóa ngoại: sản phẩm_ibfk_1 và sản phẩm_ibfk_2
Bạn có thể thả các khóa ngoại của bảng  products bằng cách sử dụng câu lệnh sau:
ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_1;
ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_2;

MySQL disabling foreign key checks

Đô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.

Để vô hiệu hóa kiểm tra khóa ngoại, bạn sử dụng câu lệnh sau:
SET foreign_key_checks = 0;
Và tất nhiên, bạn có thể kích hoạt nó bằng cách sử dụng câu lệnh dưới đây:
SET foreign_key_checks = 1;

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.

Last updated