ALTER TABLE स्टेटमेंट में 'ON DELETE CASCADE' कैसे जोड़ें


130

मेरी टेबल में एक विदेशी की कमी है, मैं इसमें DELETE CASCADE जोड़ना चाहता हूं।

मैंने यह कोशिश की है:

परिवर्तन तालिका child_table_name
  बाधा fk_name संशोधित करें
  विदेशी कुंजी (child_column_name)
  हटाए गए कैस्केड पर संदर्भ parent_table_name (parent_column_name);

काम नहीं करता है।

संपादित करें:
विदेशी कुंजी पहले से मौजूद है, विदेशी कुंजी कॉलम में डेटा हैं।

कथन निष्पादित करने के बाद मुझे मिलने वाला त्रुटि संदेश:

ORA-02275: इस तरह के एक संदर्भित अवरोध पहले से ही तालिका में मौजूद हैं

समस्या क्या है? कथन को अस्वीकार कर दिया गया है, नष्ट नहीं होता है ..
थोरस्टन

जवाबों:



86

पहले dropअपनी विदेशी कुंजी और अपने उपर्युक्त कमांड को आज़माएं, add constraintइसके स्थान पर रखें modify constraint। अब यह आदेश है:

ALTER TABLE child_table_name 
  ADD CONSTRAINT fk_name 
  FOREIGN KEY (child_column_name) 
  REFERENCES parent_table_name(parent_column_name) 
  ON DELETE CASCADE;

24
वह हमें पूरे कोड देता है यह उन लोगों के लिए काफी लाभकारी है जिनका पोस्टगर्ज़ से कोई लेना-देना नहीं है
मैथिस कोहली

1
@IiMaxx संस्थापक एक ईर्ष्यालु लड़का है। lol यह उत्तर पहले उत्तर की तुलना में अधिक महत्वपूर्ण है क्योंकि यह कोड भी प्रदान करता है ..
मैं सबसे अधिक मूर्ख व्यक्ति हूँ

11

यह PL * SQL DBMS_OUTPUT को एक स्क्रिप्ट लिखेगा जो प्रत्येक बाधा को हटा देगा जिसमें कैस्केड नहीं है और इसे डिलीट कैस्केड के साथ फिर से बनाएँ।

ध्यान दें: इस स्क्रिप्ट का आउटपुट रन करना आपका अपना जोखिम है। परिणामी स्क्रिप्ट को पढ़ने और इसे निष्पादित करने से पहले इसे संपादित करने के लिए सबसे अच्छा है।

DECLARE
      CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS
        select * from user_cons_columns
            where constraint_name = theCons and owner = theOwner
            order by position;
      firstCol BOOLEAN := TRUE;
    begin
        -- For each constraint
        FOR cons IN (select * from user_constraints
            where delete_rule = 'NO ACTION'
            and constraint_name not like '%MODIFIED_BY_FK'  -- these constraints we do not want delete cascade
            and constraint_name not like '%CREATED_BY_FK'
            order by table_name)
        LOOP
            -- Drop the constraint
            DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';');
            -- Re-create the constraint
            DBMS_OUTPUT.PUT('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME 
                                        || ' FOREIGN KEY (');
            firstCol := TRUE;
            -- For each referencing column
            FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER)
            LOOP
                IF(firstCol) THEN
                    firstCol := FALSE;
                ELSE
                    DBMS_OUTPUT.PUT(',');
                END IF;
                DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
            END LOOP;                                    

            DBMS_OUTPUT.PUT(') REFERENCES ');

            firstCol := TRUE;
            -- For each referenced column
            FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER)
            LOOP
                IF(firstCol) THEN
                    DBMS_OUTPUT.PUT(consCol.OWNER);
                    DBMS_OUTPUT.PUT('.');
                    DBMS_OUTPUT.PUT(consCol.TABLE_NAME);        -- This seems a bit of a kluge.
                    DBMS_OUTPUT.PUT(' (');
                    firstCol := FALSE;
                ELSE
                    DBMS_OUTPUT.PUT(',');
                END IF;
                DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
            END LOOP;                                    

            DBMS_OUTPUT.PUT_LINE(')  ON DELETE CASCADE  ENABLE VALIDATE;');
        END LOOP;
    end;

11

जैसा कि पहले बताया गया है:

ALTER TABLE TABLEName
drop CONSTRAINT FK_CONSTRAINTNAME;

ALTER TABLE TABLENAME
ADD CONSTRAINT FK_CONSTRAINTNAME
    FOREIGN KEY (FId)
    REFERENCES OTHERTABLE
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

जैसा कि आप देख सकते हैं कि उन्हें अलग-अलग कमांड करना होगा, पहले ड्रॉपिंग फिर जोड़ना।


यह Oracle के लिए अमान्य है
a_horse_with_no_name

बस SqlServer में परीक्षण किया गया है, लेकिन संभव है कि आपको goअर्ध-बृहदान्त्र के साथ ही पोस्टग्रेज और खुद SqlServer में मौका देना होगा । लेकिन मुख्य कोर कोड sql standar हैं। अर्ध-कॉलनों के साथ परीक्षण करें, मैंने अभी इसे बदल दिया
डेविड सिल्वा-बैरेरा

[या ]मानक SQL (और Oracle) में अमान्य हैं। ओरेकल भी on updateएक विदेशी कुंजी के लिए क्लॉज का समर्थन नहीं करता है ।
a_horse_with_no_name

आप सही हैं, [ ]SqlServer विशिष्ट हैं। मैं इसे और साफ कर दूंगा। के बारे में on updateमैं कुछ नहीं कह सकता।
डेविड सिल्वा-बैरेरा

11

MYSQL USERS के लिए उत्तर:

ALTER TABLE ChildTableName 
DROP FOREIGN KEY `fk_table`;
ALTER TABLE ChildTableName 
ADD CONSTRAINT `fk_t1_t2_tt`
  FOREIGN KEY (`parentTable`)
  REFERENCES parentTable (`columnName`)
  ON DELETE CASCADE
  ON UPDATE CASCADE;

StackOverflow में आपका स्वागत है। कृपया stackoverflow.com/editing-help में कोड स्वरूपण के बारे में जानें । मैंने इसे और अधिक पठनीय बनाने के लिए आपके लिए कोड संपादित किया।
एड्रियन डब्ल्यू

3

MySQL का उपयोग करने वाले किसी के लिए:

यदि आप अपने PHPMYADMINवेबपेज पर जाते हैं और उस तालिका पर नेविगेट करते हैं जिसमें वह विदेशी कुंजी है जिसे आप अपडेट करना चाहते हैं, तो आपको केवल इतना करना है Relational view कि Structureटैब में स्थित पर क्लिक करें और On deleteचयन मेनू विकल्प को बदल दें Cascade

नीचे दिखाया गया चित्र:

यहाँ छवि विवरण दर्ज करें


ओपी 2009 से है, इसका ओरेकल प्रश्न टैग किया गया है, और PHPMYADMIN MySQL के लिए एक तृतीय-पक्ष सॉफ़्टवेयर घटक है।
वेजीट्रैपी

7
बिल्कुल सच। लेकिन मैं इस सवाल के लिए Googled, जानना चाहता था कि यह MySQL में कैसे किया जाए, और Google मुझे यहां लाया। हां, सवाल ओरेकल के साथ टैग किया गया है, इसलिए यह उत्तर सही नहीं है ... लेकिन यह मेरे जैसे पाठकों के लिए उपयोगी होगा जो इस उत्तर पर ठोकर खाते हैं। तो यह है इस पेज को जोड़ने के मूल्य, भले ही वह ओरेकल विशिष्ट नहीं है। तो, धन्यवाद James111!
माइक गिल्डहिल

3

यहाँ एक आसान समाधान है! मैं SQL Server 2008 R2 का उपयोग कर रहा हूं।

जैसा कि आप DELETE / UPDATE CASCADE को जोड़कर FK बाधा को संशोधित करना चाहते हैं, इन चरणों का पालन करें:

संख्या 1:

बाधा पर राइट क्लिक करें और संशोधित करने के लिए क्लिक करें

यहाँ छवि विवरण दर्ज करें

संख्या 2:

बाईं ओर अपना अवरोध चुनें (यदि एक से अधिक हैं)। फिर दाईं ओर, " INSERT और UPDATE स्पेसिफिकेशन " को ध्वस्त करें और अपनी आवश्यकता के अनुरूप डिलीट नियम या अपडेट नियम पंक्ति पर क्रियाओं को निर्दिष्ट करें। उसके बाद, संवाद बॉक्स बंद करें।

यहाँ छवि विवरण दर्ज करें

संख्या 3:

अंतिम चरण शोध संशोधनों (बेशक!) को बचाना है।

यहाँ छवि विवरण दर्ज करें

पुनश्च: यह मुझे काम के एक समूह से बचाया है क्योंकि मैं एक अन्य तालिका में संदर्भित प्राथमिक कुंजी को संशोधित करना चाहता हूं।


बिल्कुल सही, मैं क्या जरूरत के रूप में अच्छी तरह से!
वाइल्डव्यू

1

यदि आप एक विदेशी कुंजी को बदलना चाहते हैं, तो आप उसे छोड़ सकते हैं:

ALTER TABLE child_table_name  WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.