मैं सिर्फ another question जहां इस सवाल डुप्लीकेट के रूप में ही था जवाब दे दिया। मुझे लगता है कि यहां मेरा उत्तर भी देना उचित है:
यह संभव नहीं है। आप एक 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 ट्रिगर के साथ इस का समाधान एक पुनरावर्ती CTE उपयोग करने वाले सभी आईडी आप हटा रहे हैं निम्नलिखित सभी आईडी प्राप्त करने के लिए कर सकते हैं। ये आईडी हटा दी गई हैं।
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
- इसे यहां देखें, विभिन्न आईडी के साथ प्रयास करें। आप (वास्तविक डेटा के साथ Carefull!) WHERE id IN(4,3)
भी कोशिश कर सकते हैं ...
SELECT * FROM locations;
DELETE FROM locations WHERE id=4;
SELECT * FROM locations
GO
--Clean-अप
if exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME='locations')
---DROP TABLE locations;
PostgreSQL यह समर्थन करता है। अब अगर एक और प्रविष्टि जिसे हटाया नहीं जाना है, तो एक उपखंड को हटाया जाना है, यह एक त्रुटि जारी करेगा, और हटाए गए ऑपरेशन को वापस ले जाया जाएगा। अन्यथा, यह पूरी तरह से काम करेगा। वास्तविक मुद्दा यह है कि क्या आपके माता-पिता के संबंध गैर-चक्रीय निर्देशित ग्राफ हैं या नहीं। चूंकि अधिकांश आत्म-संदर्भ पदानुक्रमों को लागू करते हैं, और पदानुक्रमों को गैर-चक्रीय ग्राफों को निर्देशित किया जाना चाहिए, अधिकांश मामलों में PostgreSQL के कार्यवाही का कार्य अधिक गंभीर होना चाहिए। अन्य सभी मामलों में, आप अभी भी उस कार्यक्षमता को मैन्युअल रूप से कार्यान्वित कर सकते हैं, इसलिए कुछ भी नहीं खो गया है। –