Khóa ngoại với Cascade DELETE trong SQL Server là gì?
Khóa ngoại với Cascade Delete nghĩa là nếu một bản ghi trong bảng mẹ bị xóa thì bản ghi tương ứng trong bảng con cũng sẽ tự động bị xóa.
Khóa ngoại với ràng buộc tự động xóa được tạo bằng cách dùng lệnh CREATE TABLE hoặc ALTER TABLE.
Tạo khóa ngoại với ràng buộc tự động xóa 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 CASCADE
[ 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 CASCADE
Chỉ định dữ liệu con sẽ bị xóa khi dữ liệu mẹ bị xóa.
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.
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)
ON DELETE CASCADE
);
Ở ví dụ này, chúng ta tạo ra bảng mẹ là sanpham với khóa chính gồm trường thông tin là id_sanpham. Sau đó là bảng con có tên hangtonkho với khóa ngoại có ràng buộc xóa. 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 CASCADE nói cho SQL Server biết rằng phải xóa bản ghi tương ứng trong bảng con khi dữ liệu ở bảng mẹ bị xóa. Ở ví dụ này, giá trị id_sanpham bị xóa khỏi bảng sanpham thì bản ghi tương ứng trong bảng con hangtonkho dùng id_sanpham này cũng sẽ bị xóa.
Tạo khóa ngoại với ràng buộc xóa 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)
REFERENCE
S bang_me (cot_me1, cot_me2, … cot_me_n) ON DELETE CASCADE;
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.
ON DELETE CASCADE
Cho biết dữ liệu trong bảng con sẽ bị xóa khi dữ liệu trong bảng mẹ bị xóa.
Ví dụ
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE CASCAD
E;
Trong ví dụ về khóa ngoại này, bảng con hangtonkho được tạo với khóa ngoại có tên fk_htk_id_sanpham, tham chiếu tới bảng mẹ sanpham dựa trên id_sanpham.
Vì chỉ định ON DELETE CASCADE nên nếu giá trị id_sanpham bị xóa khỏi bảng mẹ thì bản ghi tuong ứng trong bảng con cũng sẽ bị xóa.
14 Th1 2021
23 Th12 2020
16 Th12 2020
25 Th12 2020
3 Th12 2019
8 Th1 2021