Tôi chỉ trả lời another question nơi câu hỏi này được ràng buộc như trùng lặp. Tôi nghĩ rằng cũng đáng để đặt câu trả lời của tôi ở đây:
Điều này là không thể. Bạn có thể giải quyết việc này với một INSTEAD OF TRIGGER
create table locations
(
id int identity(1, 1),
name varchar(255) not null,
parent_id int,
constraint pk__locations
primary key clustered (id)
)
GO
INSERT INTO locations(name,parent_id) VALUES
('world',null)
,('Europe',1)
,('Asia',1)
,('France',2)
,('Paris',4)
,('Lyon',4);
GO
--This kích hoạt sẽ sử dụng một CTE đệ quy để có được tất cả các ID sau tất cả id bạn đang xóa. Các ID này sẽ bị xóa.
CREATE TRIGGER dbo.DeleteCascadeLocations ON locations
INSTEAD OF DELETE
AS
BEGIN
WITH recCTE AS
(
SELECT id,parent_id
FROM deleted
UNION ALL
SELECT nxt.id,nxt.parent_id
FROM recCTE AS prv
INNER JOIN locations AS nxt ON nxt.parent_id=prv.id
)
DELETE FROM locations WHERE id IN(SELECT id FROM recCTE);
END
GO
--Test it here, thử với các ID khác nhau. Bạn có thể thử WHERE id IN(4,3)
cũng ...
SELECT * FROM locations;
DELETE FROM locations WHERE id=4;
SELECT * FROM locations
GO
--Clean-Up (cẩn thận với dữ liệu thực tế!)
if exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME='locations')
---DROP TABLE locations;
PostgreSQL hỗ trợ nó. Bây giờ nếu một mục khác không bị xóa tham chiếu đến một tệp con sẽ bị xóa, nó sẽ phát hành một lỗi và thao tác xóa sẽ được khôi phục. Nếu không, nó sẽ hoạt động hoàn hảo. Vấn đề thực sự là, cho dù mối quan hệ cha-con của bạn là một đồ thị theo hướng không tuần hoàn hay không. Bởi vì hầu hết các tài liệu tham khảo tự thực hiện phân cấp, và các hệ thống phân cấp nên được định hướng theo các biểu đồ không tuần hoàn, quá trình hành động của PostgreSQL sẽ trở nên lành mạnh hơn trong hầu hết các trường hợp. Trong tất cả các trường hợp khác, bạn vẫn có thể thực hiện chức năng đó theo cách thủ công, vì vậy không có gì bị mất. –