Hướng dẫn này giới thiệu cách sử dụng khóa ngoại Foreign Key trong SQL Server với cú pháp và ví dụ.
Khoá ngoại trong SQL Server là gì?
Khóa ngoại được sử dụng để tăng tham chiếu trong cơ sở dữ liệu SQL Server. Khóa ngoại có 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 được gọi là bảng mẹ, trong khi bảng chứa khóa ngoại được gọi là bảng con. Khóa ngoại trong bảng con thường tham chiếu đến khóa chính PRIMARY KEY trong bảng mẹ.
Các 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 bạn muốn tạo.
cot1, cot2
Cột bạn muốn tạo trong bảng. Mỗi cột có 1 kiểu dữ liệu, phải được chỉ định chứa giá trị NULL hoặc NOT NULL, nếu không, giá trị mặc định là NULL.
Kiểu dữ liệu trong SQL Server
fk_ten
Tên của ràng buộc khóa ngoại cần tạo.
cot_con1, cot_con2 ,. cot_con_n
Cột trong bang_con muốn tham chiếu đến khóa chính trong bang_me.
bang_me
Tên của bảng mẹ chứa khóa chính được sử 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.
BẬT XÓA
Tùy chọn. Cho biết phải làm gì với dữ liệu con khi dữ liệu mẹ bị xóa. Có các tùy chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.
BẬT CẬP NHẬT
Tùy chọn. Cho biết những việc cần làm với dữ liệu con khi dữ liệu mẹ được cập nhật. Có các tùy chọn NO ACTION, CASCADE, SET NULL và SET DEFAULT.
KHÔNG CÓ HÀNH ĐỘNG
Sử dụng khi BẬT XÓA hoặc BẬT CẬP NHẬT, tức 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
Sử dụng khi BẬT XÓA hoặc BẬT CẬP NHẬT, nghĩa là dữ liệu con sẽ bị xóa hoặc cập nhật khi dữ liệu mẹ bị xóa hoặc cập nhật.
ĐẶT ĐẦY ĐỦ
Sử dụng khi BẬT XÓA hoặc BẬT CẬP NHẬT, nghĩa là dữ liệu con được đặt thành NULL khi dữ liệu mẹ bị xóa hoặc cập nhật.
ĐẶT ĐỊNH NGHĨA
Sử dụng khi BẬT XÓA hoặc BẬT CẬP NHẬT, 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 (Xóa theo tầng) trong SQL Server
- Khóa ngoại (Đặt Null) khóa ngoại 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 cha, bảng sanpham với khóa chính bao gồm các trường trong id_sanpham. Tiếp theo là bảng phụ hangtonkho.
Câu lệnh CREATE TABLE được sử dụng để tạo khóa ngoại của bảng hangtonkho được đặt tên là fk_htk_id_sanpham. Khóa ngoại tạo 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 hướng dẫn cách tạo khóa ngoại gồm 1 cột. Bây giờ, hãy tạo một 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) );
Trong ví dụ này, bảng mẹ sanpham có khóa chính hai cột ten_sanpham và diadiem. Bảng con và khóa ngoại phải tham chiếu đến hai 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 bạn muốn tạo.
fk_ten
Tên của ràng buộc khóa ngoại cần tạo.
cot_con1, cot_con2 ,. cot_con_n
Cột trong bang_con muốn tham chiếu đến khóa chính trong bang_me.
bang_me
Tên của bảng mẹ chứa khóa chính được sử 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 được gọi là fk_htk_id_sanpham, tham chiếu đến bảng sanpham dựa trên cột id_sanpham.
Bạn có thể tạo khóa ngoại với nhiều trường như ví dụ bên dưới.
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 đến trang tổng quan dựa trên cột ten_sanpham và diadiem.