Hướng dẫn sau sẽ giải thích về khóa ngoại Foreign Key với ràng buộc Set Null On Delete trong SQL Server.
Khóa ngoại với Đặt NULL khi Xóa trong SQL Server là gì?
Các khóa ngoại bị ràng buộc đặt Null khi Xóa nghĩa là khi một bản ghi trong bảng mẹ bị xóa, bản ghi tương ứng trong bảng con trong trường giá trị khóa ngoại sẽ được đặt thành NULL. Bảng được viết trong bảng con sẽ không bị xóa khỏi SQL Server.
Các khóa ngoại với điều kiện là giá trị NULL khi bị xóa có thể được tạo bằng câu lệnh CREATE TABLE hoặc ALTER TABLE.
Tạo khóa ngoại có ràng buộc để đặt giá trị NULL khi bị xóa bằng câu lệnh CREATE TABLE
Cú pháp
CREATETABLE 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 SET NULL
[ 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 CÀI ĐẶT XÓA NULL
Dữ liệu trong bảng con sẽ được đặt thành NULL khi dữ liệu trong bảng mẹ bị xóa. Dữ liệu phụ không bị xóa.
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.
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,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE SET NULL
);
Trong ví dụ này, chúng tôi đã tạo bảng mẹ, sanpham, với khóa chính bao gồm trường thông tin id_sanpham. Sau đó, có một bảng con tên là hangtonkho với khóa ngoại có ràng buộc xóa. Câu lệnh CREATE TABLE tạo khóa ngoại trên bảng hangtonkho có tên fk_htk_id_sanpham. Khóa ngoại hình thành mối quan hệ giữa cột id_sanpham trong bảng hangtonkho và id_sanpham trong bảng sanpham.
Khóa ngoại này được chỉ định ON DELETE SET NULL để cho SQL Server biết rằng cần đặt giá trị bản ghi tương ứng trong bảng con thành NULL khi dữ liệu trong bảng mẹ là đã xóa. Trong ví dụ này, khi id_sanpham bị xóa khỏi bảng, bản ghi tương ứng trong bảng hangtonkho sử dụng id_sanpham sẽ được đặt thành NULL.
Điều quan trọng cần lưu ý là vì cột id_sanpham trong bảng hangtonkho sẽ được đặt thành NULL, nên cần đảm bảo rằng cột này được phép nhận giá trị NULL. Nếu được đặt thành NOT NULL khi được tạo bằng CREATEA, bạn sẽ gặp phải lỗi sau.
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)
ON DELETE SET NULL
);
Msg 1761, Level 16, State 0, Line 1
Cannot create the foreign key 'fk_htk_id_sanpham' with the SET NULL referential action, because one or more referencing columns are not nullable.
Msg 1750, Level 16, State 0, Line 1
Could
thể tạo constraint hoặc chỉ mục. Xem lỗi trước.
Đảm bảo bạn xác định cột id_sanpham trong bảng hangtonkho để nhận các giá trị NULL như hình dưới đây.
CREATE TABLE hangtonkho
( id_hangtonkho INT PRIMARY KEY,
id_sanpham INT,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE SET NULL
);
Comma
nd (s) completed successfully.
Tạo khóa ngoại với ràng buộc đặt giá trị NULL khi xóa bằng câu lệnh ALTER TABLE
Cú pháp
ALTER TABLE state_con
ADD CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, . cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, . cot_me_n)
ON DELETE SET NULL;
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.
BẬT CÀI ĐẶT XÓA NULL
Chỉ định rằng dữ liệu con sẽ được đặt thành giá trị NULL khi dữ liệu trong bảng mẹ bị xóa. Dữ liệu trong bảng con sẽ không bị xóa.
Ví dụ
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE
SET NULL;
Trong ví dụ này, bảng con hangtonkho được tạo bằng khóa ngoại có tên fk_htk_id_sanpham, tham chiếu đến bảng mẹ sanpham dựa trên id_sanpham.
Chỉ định BẬT XÓA ĐẶT NULL cho SQL Server để hiểu rằng khi dữ liệu id_sanpham trong bảng mẹ bị xóa, bản ghi tương ứng trong bảng phụ hangtonkho sẽ được đặt thành giá trị NULL.