ON DELETE CASCADE tự xóa child rows khi parent bị xóa — tiện nhưng nguy hiểm nếu dùng nhầm; RESTRICT (default) an toàn nhất; chỉ dùng CASCADE khi child không có nghĩa gì nếu thiếu parent (order_items, sessions).
- ON DELETE CASCADE: xóa user → tự xóa tất cả orders, comments, sessions — tiện nhưng nguy hiểm nếu dùng nhầm.
- Cascade propagate action từ parent xuống child table tự động.
- ON DELETE CASCADE: xóa user → tự xóa tất cả orders, comments, sessions — tiện nhưng nguy hiểm nếu dùng nhầm.
- ON DELETE SET NULL: xóa category → products.category_id = NULL, products vẫn tồn tại — dùng khi child có thể tồn tại độc lập.
- ON DELETE RESTRICT (default): block delete parent nếu còn child — safe nhất, application phải xử lý explicitly.
- ON DELETE SET DEFAULT: set FK về default value.
- ON UPDATE CASCADE: hữu ích khi PK có thể thay đổi (natural keys) — ít dùng với surrogate keys vì chúng immutable.
- Cascade chains:
A → B → Cvới CASCADE, xóa A tự xóa B rồi C — có thể không nhận ra. - Kiểm tra cascade impact:
SELECT * FROM information_schema.referential_constraints WHERE unique_constraint_schema = 'public'. - Khi nào dùng CASCADE: ownership relationship rõ ràng (user → sessions, order → order_items — items không có nghĩa gì nếu không có order).
- Khi không nên: shared resources (xóa author không nên xóa books nếu books có value độc lập).
- Soft delete + CASCADE: khi dùng soft delete thì CASCADE không kích hoạt — phải implement cascade logic trong application.