Khóa ngoại Foreign Key trong SQL Server

Khóa ngoại trong SQL Server là gì?

Khóa ngoại được dùng để tăng tính tham chiếu trong cơ sở dữ liệu SQL Server. Khóa ngoại nghĩa là giá trị trong bảng này phải xuất hiện trong bảng khác.

Bảng tham chiếu gọi là bảng mẹ, còn bảng chứa khóa ngoại gọi là bảng con. Khóa ngoại trong bảng con thường tham chiếu tới khóa chính PRIMARY KEY trong bảng mẹ.

Khóa ngoại có thể được tạo bằng lệnh CREATE TABLE hoặc lệnh ALTER TABLE.

Tạo khóa ngoại bằng lệnh CREATE TABLE

Cú pháp

CREATE TABLE bang_con
 (
  cot1 kieudulieu [ NULL | NOT NULL ],
  cot2 kieudulieu [ NULL | NOT NULL ],
  
 
  CONSTRAINT fk_ten
   FOREIGN KEY (cot_con1, cot_con2,  cot_con_n)
   REFERENCES bang_me (cot_me1, cot_me2,  cot_me_n)
   [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
   [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
 );

bang_con

Tên của bảng con muốn tạo.

cot1, cot2

Cột muốn tạo trong bảng. Mỗi cột có 1 loại dữ liệu, phải được chỉ định là chứa giá trị NULL hay NOT NULL, nếu không sẽ mặc định là NULL.

Các kiểu dữ liệu trong SQL Server

fk_ten

Tên của ràng buộc khóa ngoại muốn tạo.

cot_con1, cot_con2, … cot_con_n

Cột trong bang_con muốn tham chiếu tới khóa chính trong bang_me.

bang_me

Tên của bảng mẹ chứa khóa chính được dùng trong bang_con.

cot_me1, cot_me2, … cot_me_n

Cột tạo nên khóa chính trong bang_me. Khóa ngoại sẽ tạo ràng buộc giữa dữ liệu và các cột cot_con1, cot_con2, … cot_con_n trong bang_con.

ON DELETE

Tùy chọn. Cho biết sẽ làm gì với dữ liệu con khi dữ liệu mẹ bị xóa. Có các lựa chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.

ON UPDATE

Tùy chọn. Cho biết sẽ làm gì với dữ liệu con khi dữ liệu mẹ được cập nhật. Có các lựa chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.

NO ACTION

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là không làm gì với dữ liệu con khi dữ liệu mẹ bị xóa hoặc cập nhật.

CASCADE

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con bị xóa hoặc cập nhật khi dữ liệu mẹ bị xóa hoặc cập nhật.

SET NULL

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con được đặt là NULL khi dữ liệu mẹ bị xóa hoặc cập nhật.

SET DEFAULT

Dùng với ON DELETE hoặc ON UPDATE, nghĩa là dữ liệu con được đặt thành giá trị mặc định khi dữ liệu mẹ bị xóa hoặc cập nhật.

  • Khóa ngoại Foreign Key (Cascade Delete) trong SQL Server
  • Khóa ngoại Foreign Key (Set Null) trong SQL Server

Ví dụ

CREATE TABLE sanpham
 (id_sanpham INT PRIMARY KEY,
 ten_sanpham VARCHAR(50) NOT NULL,
  phan_loai VARCHAR(25)
 );
 
 CREATE TABLE hangtonkho
 ( id_hangtonkho INT PRIMARY KEY,
   id_sanpham INT NOT NULL,
   soluong INT,
   luong_toithieu INT,
   luong_toida INT,
   CONSTRAINT fk_htk_id_sanpham
   FOREIGN KEY (id_sanpham)
   REFERENCES sanpham (id_sanpham)
 );

Trong ví dụ trên, chúng ta tạo bảng mẹ là bảng sanpham có khóa chính gồm các trường trong id_sanpham. Tiếp theo là tạo bảng con hangtonkho.

Lệnh CREATE TABLE được dùng để tạo khóa ngoại của bảng hangtonkho có tên là fk_htk_id_sanpham. Khóa ngoại hình thành mối liên kết giữa cột id_sanpham trong bảng hangtonkho và id_sanpham trong bảng sanpham.

Ví dụ trên cho thấy cách tạo khóa ngoại gồm 1 cột. Giờ hãy tạo khóa ngoại có nhiều hơn 1 trường thông tin.

Ví dụ

CREATE TABLE sanpham
 ( ten_sanpham VARCHAR(50) NOT NULL,
   diadiem VARCHAR(50) NOT NULL,
   phanloai VARCHAR(25)
   CONSTRAINT sanpham_pk PRIMARY KEY (ten_sanpham, diadiem)
 );
CREATE TABLE hangtonkho
 ( id_hangtonkho INT PRIMARY KEY,
   ten_sanpham VARCHAR(50) NOT NULL,
   diadiem VARCHAR(50) NOT NULL,
   soluong INT,
   luong_toithieu INT,
   luong_toida INT,
   CONSTRAINT fk_htk_sanpham
   FOREIGN KEY (ten_sanpham, diadiem)
   REFERENCES sanpham (ten_sanpham, diadiem)
 );

Ở ví dụ này, bảng mẹ sanpham có khóa chính gồm 2 cột là ten_sanpham và diadiem. Bảng con và khóa ngoại phải tham chiếu tới 2 cột này.

Tạo khóa ngoại bằng lệnh ALTER TABLE

Cú pháp

ALTER TABLE bang_con
 ADD CONSTRAINT fk_ten
   FOREIGN KEY (cot_con1, cot_con2,  cot_con_n)
   REFERENCES bang_me (cot_me1, cot_me2,  cot_me_n);

bang_con

Tên của bảng con muốn tạo.

fk_ten

Tên của ràng buộc khóa ngoại muốn tạo.

cot_con1, cot_con2, … cot_con_n

Cột trong bang_con muốn tham chiếu tới khóa chính trong bang_me.

bang_me

Tên của bảng mẹ chứa khóa chính được dùng trong bang_con.

cot_me1, cot_me2, … cot_me_n

Cột tạo nên khóa chính trong bang_me. Khóa ngoại sẽ tạo ràng buộc giữa dữ liệu và các cột cot_con1, cot_con2, … cot_con_n trong bang_con.

Ví dụ

ALTER TABLE hangtonkho
 ADD CONSTRAINT fk_htk_id_sanpham
  FOREIGN KEY (id_sanpham)
  REFERENCES sanpham (id_sanpham);

Ví dụ này tạo khóa ngoại trong bảng hangtonkho gọi là fk_htk_id_sanpham, tham chiếu tới bảng sanpham dựa trên cột id_sanpham.

Có thể tạo khóa ngoại với nhiều hơn 1 trường như ví dụ dưới đây.

ALTER TABLE hangtonkho
 ADD CONSTRAINT fk_htk_sanpham
  FOREIGN KEY (ten_sanpham, diadiem)
  REFERENCES sanpham (ten_sanpham, diadiem);

Ví dụ trên tạo khóa ngoại có tên fk_htk_sanpham cho bảng hangtonkho, tham chiếu tới bảng sanpham dựa trên cột ten_sanpham và diadiem.