Hướng dẫn này giới thiệu cách sử dụng Foreign Key (khóa ngoại) trong SQL Server với cú pháp và ví dụ.
Khóa ngoại trong SQL Server là gì?
Khóa ngoại được dùng để thiết lập tham chiếu (referential integrity) 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 một bảng khác.
Bảng được tham chiếu gọi là bảng cha (parent table), trong khi bảng chứa khóa ngoại gọi là bảng con (child table). Khóa ngoại trong bảng con thường tham chiếu đến khóa chính PRIMARY KEY trong bảng cha.
Khóa ngoại có thể được tạo với lệnh CREATE TABLE hoặc 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 } ]
);
Tham số
bang_con: Tên bảng con muốn tạo.
cot1, cot2: Các cột muốn tạo trong bảng. Mỗi cột có 1 kiểu dữ liệu, phải chỉ định chứa NULL hoặc NOT NULL, nếu không mặc định là NULL.
fk_ten: Tên 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 đến khóa chính trong bang_me.
bang_me: Tên bảng cha chứa khóa chính dùng trong bang_con.
cot_me1, cot_me2, … cot_me_n: Các cột cấu thành 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. Chỉ định hành động với dữ liệu con khi dữ liệu cha bị xóa. Các tùy chọn: NO ACTION, CASCADE, SET NULL, SET DEFAULT.
ON UPDATE: Tùy chọn. Chỉ định hành động với dữ liệu con khi dữ liệu cha được cập nhật. Các tùy chọn: NO ACTION, CASCADE, SET NULL, SET DEFAULT.
NO ACTION: Không làm gì với dữ liệu con khi dữ liệu cha bị xóa hoặc cập nhật.
CASCADE: Dữ liệu con bị xóa hoặc cập nhật khi dữ liệu cha bị xóa hoặc cập nhật.
SET NULL: Dữ liệu con được đặt thành NULL khi dữ liệu cha bị xóa hoặc cập nhật.
SET DEFAULT: Dữ liệu con được đặt thành giá trị mặc định khi dữ liệu cha bị xóa hoặc cập nhật.
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 là sanpham với khóa chính gồm trường id_sanpham. Tiếp theo là bảng con hangtonkho.
Lệnh CREATE TABLE dùng để tạo khóa ngoại của bảng hangtonkho tên là fk_htk_id_sanpham. Khóa ngoại thiết lập 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. Bây giờ tạo khóa ngoại với nhiều hơn 1 trường thông tin.
Ví dụ – khóa ngoại nhiều cột
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 cha 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);
Tham số
bang_con: Tên bảng con muốn tạo.
fk_ten: Tên 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 đến khóa chính trong bang_me.
bang_me: Tên bảng cha chứa khóa chính dùng trong bang_con.
cot_me1, cot_me2, … cot_me_n: Các cột cấu thành khóa chính trong bang_me.
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 tên fk_htk_id_sanpham, tham chiếu 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 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 tên fk_htk_sanpham cho bảng hangtonkho, tham chiếu đến bảng sanpham dựa trên cột ten_sanpham và diadiem.