2012-03-09 11 views
12

के साथ एक बच्चे और अभिभावक पंक्ति को हटाएं बच्चे की पंक्ति को हटाने और फिर मूल पंक्ति को हटाने के लिए एक और एसक्यूएल कथन लिखने के बजाय मैं एक कथन का उपयोग करना चाहता था जो दोनों करेगा। एफवाईआई: हम ओरेकल डेटाबेस का उपयोग करते हैं।एक एसक्यूएल स्क्रिप्ट

अद्यतन: मैं न CASCADE

+0

अपनी विदेशी कुंजी बाधा में कैस्केड पर हटाएं .. – Teja

उत्तर

12

पर DELETE cascading deletes के साथ अपने विदेशी कुंजी को परिभाषित करने के लिए एक विशेषाधिकार है। फिर आपको केवल "पैरेंट" पंक्ति को हटाने की आवश्यकता है।

+1

ठीक है, मुझे ऐसा करने का विशेषाधिकार नहीं है। – WowBow

+2

@WowBow - फिर आपको दो 'DELETE' कथनों की आवश्यकता है – Lamak

+1

अपने डीबीए से ऐसा करने के लिए कहें ... – Teja

1

आप हमेशा जब आप एक माता पिता पंक्ति को हटा बच्चों को हटाना चाहते हैं, तो आप विदेशी कुंजी बाधा घोषणा कर सकते हैं ताकि Oracle बच्चे स्वतः

create table parent (
    parentID number primary key, 
    parentData varchar2(100) 
); 

create table child (
    childID number primary key, 
    parentID number references parent(parentID) on delete cascade, 
    childData varchar2(100) 
); 

हटाना उदाहरण के लिए, एक माता पिता की मेज घोषणा करेंगे करता है और जब आप मूल पंक्ति को हटाते हैं तो एक बाल तालिका और स्वचालित रूप से बाल पंक्तियों को हटा दें। यदि आप नहीं चाहते हैं कि इस तरह की चीज स्वचालित रूप से लागू की जाए या आपको जटिलता पसंद नहीं है जो पृष्ठभूमि में "स्वचालित रूप से" होने पर जोड़ा जाता है, तो आप शायद DELETE कथनों का उपयोग करके अटक गए हैं।

+0

आपकी मदद के लिए धन्यवाद। हालांकि, मुझे टेबल बनाने या डिलीट कैस्केड में बदलाव करने का कोई विशेषाधिकार नहीं है। तालिका में पहले से ही हजारों रिकॉर्ड हैं। तो मैंने दो वर्ग के बयान दिए। – WowBow

0

एक और (उबाऊ तरीका, हमारे पास यह डेटाबेस में है, अज्ञात कारण के लिए, बाधाओं के रूप में विदेशी कुंजी का उपयोग न करें - हां हां) ऐसा करने के लिए इसे हटाए जाने के बाद (या पहले) ट्रिगर बनाना होगा।

आपको एक और डिलीट क्वेरी लिखनी होगी, लेकिन बस ट्रिगर में।

लेकिन अगर आप झरना को नष्ट नहीं डाल सकते हैं, मुझे यकीन है कि आप ट्रिगर जोड़ सकते हैं नहीं कर रहा हूँ ...

1

आप इसे बुरी तरह से केवल कर सकते हैं - जैसे कि, ट्रिगर का उपयोग कर।

create table parent 
(pid number, 
    constraint parent_pk 
    primary key (pid) 
    using index 
); 

create table child 
    (cid number, 
    pid number, 
    constraint child_pk 
    primary key(cid) 
    using index, 
    constraint child_fk 
    foreign key (pid) 
    references parent (pid) 
); 

create index child_fk on child (pid); 

create trigger fake_delete_cascade 
before delete on parent 
for each row 
begin 
    delete from child where pid = :old.pid; 
end; 
/

insert into parent values (1); 
insert into child values (1,1); 
commit; 
select count(*) from child; 
delete from parent where pid = 1; 
select count(*) from child; 
3
delete from 
(
select * from parent join child using (id) 
where id = 1 
) 

चेतावनी! केवल उन्हीं हटाएंगे जहां माता-पिता और बाल दोनों पंक्तियां मौजूद हैं। बच्चों के बिना माता-पिता को हटाएंगे