ALTER TABLE বিবৃতিতে কীভাবে 'অন ডিলেট ক্যাসকেড' যুক্ত করবেন


130

আমার টেবিলে আমার একটি বিদেশী কী বাধা আছে, আমি এটিতে মুছে ফেলা ক্যাসকেড যুক্ত করতে চাই।

আমি এটি চেষ্টা করেছি:

টেবিলের শিশু_তালিকা_নাম পরিবর্তন করুন
  সীমাবদ্ধতা fk_name পরিবর্তন করুন
  বিদেশী কী (সন্তানের_ কলাম_নাম)
  মুছে ফেলতে ক্যাসকেডের উপর প্যারেন্ট_ট্যাবল_নাম (প্যারেন্ট_ক্যালোম_নাম) রেফারেন্স;

কাজ করে না।

সম্পাদনা:
বিদেশী কী ইতিমধ্যে বিদ্যমান, বিদেশী কী কলামে ডেটা রয়েছে।

বিবৃতিটি কার্যকর করার পরে আমি যে ত্রুটি বার্তাটি পেয়েছি:

ORA-02275: এই জাতীয় রেফারেন্সিয়াল বাধা ইতিমধ্যে টেবিলটিতে বিদ্যমান in

সমস্যা কি? বিবৃতি প্রত্যাখ্যান করা হয়েছে,
মোছাটি

উত্তর:


162

আপনি ON DELETE CASCADEইতিমধ্যে বিদ্যমান সীমাবদ্ধতায় যোগ করতে পারবেন না । আপনার সীমাবদ্ধতা dropএবং পুনরায় করতে হবে createডকুমেন্টেশন অনুষ্ঠান MODIFY CONSTRAINTদফা শুধুমাত্র পরিবর্তন করতে পারেন একটি বাধ্যতা রাজ্যের (অর্থাৎ, ENABLED/DISABLED...)।


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
@ উইআইম্যাক্সএক্স প্রতিষ্ঠাতা একজন হিংসা লোক। lol এই উত্তরটি প্রথম জবাবের চেয়েও গুরুত্বপূর্ণ কারণ এটি
কোডটিও সরবরাহ করে

11

এই পিএল * এসকিউএল 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;

আপনি দেখতে পাচ্ছেন যে এগুলি পৃথক কমান্ডগুলি করতে হবে, প্রথমে ড্রপ করে তারপরে যুক্ত করা।



স্কেল সার্ভারে সবেমাত্র পরীক্ষা করা হয়েছে, তবে goপোস্টগ্রিস এবং স্কেল সার্ভারের মতোই আপনাকেও সেমি-কোলনের সাথে সুযোগ পেতে পারে। তবে অবশিষ্ট কোর কোডগুলি বর্গ স্ট্যান্ডার। আধা-কলোন দিয়ে পরীক্ষা করুন, আমি স্রেফ এটি পরিবর্তন করেছি
ডেভিড সিলভা-ব্যারেরা

[বা ]আদর্শ SQL (এবং ওরাকল) এ অবৈধ। ওরাকল on updateবিদেশী কী-র জন্য ধারাও সমর্থন করে না ।
a_horse_with_no_name

আপনি ঠিক বলেছেন, [ ]স্কেল সার্ভার নির্দিষ্ট। আমি আরও পরিষ্কার করব। সম্পর্কে on updateআমি কিছুই বলতে পারি না।
ডেভিড সিলভা-ব্যারেরা

11

MYSQL ব্যবহারকারীদের জন্য উত্তর:

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;

স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। স্ট্যাকওভারফ্লো / এডিটিং- হেল্পে কোড বিন্যাস সম্পর্কে শিখুন । কোডটি আরও পঠনযোগ্য করার জন্য আমি সম্পাদনা করেছি।
অ্যাড্রিয়ান ডব্লিউ

3

যে কেউ মাইএসকিউএল ব্যবহার করছে তাদের জন্য:

আপনি যদি নিজের PHPMYADMINওয়েবপৃষ্ঠায় চলে যান এবং আপনি যে টেবিলটিতে বিদেশী কীটি আপডেট করতে চান তা নেভিগেট করে, আপনাকে যা করতে হবে তা হল ট্যাবে Relational view অবস্থিত অবস্থানে ক্লিক Structureকরে On deleteসিলেক্ট মেনু বিকল্পটি পরিবর্তন করতে হবে Cascade

চিত্রটি নীচে দেখানো হয়েছে:

এখানে চিত্র বর্ণনা লিখুন


ওপি ২০০৯ সাল থেকে, এর ওরাকল প্রশ্ন ট্যাগ করেছে এবং পিএইচপিএমওয়াইডমিন মাইএসকিউএল এর জন্য একটি তৃতীয় পক্ষের সফ্টওয়্যার উপাদান।
vegatripy

7
একেবারে সত্য. তবে আমি এই প্রশ্নের জন্য গুগল করেছিলাম, মাইএসকিউএল-এ এটি কীভাবে করা যায় তা জানতে চেয়েছিলাম এবং গুগল আমাকে এখানে এনেছে। হ্যাঁ, প্রশ্নটি ওরাকলের সাথে ট্যাগ করা হয়েছে, সুতরাং এই উত্তরটি সঠিক নয় ... তবে এটি আমার মতো পাঠকদের পক্ষে কার্যকর হবে যারা এই উত্তরটি জুড়ে হোঁচট খায়। সুতরাং এটি এই পৃষ্ঠায় মান যুক্ত করে , এমনকি যদি এটি ওরাকল নির্দিষ্ট নয়। সুতরাং, আপনাকে ধন্যবাদ জেমস 111!
মাইক গ্লেডহিল

3

এখানে একটি সহজ সমাধান! আমি এসকিউএল সার্ভার 2008 আর 2 ব্যবহার করছি।

আপনি মুছে ফেলা / আপডেট ক্যাসকেড যোগ করে এফকে সীমাবদ্ধতা পরিবর্তন করতে চাইলে এই পদক্ষেপগুলি অনুসরণ করুন:

1 নম্বর:

সীমাবদ্ধতার উপর ডান ক্লিক করুন এবং পরিবর্তন করতে ক্লিক করুন

এখানে চিত্র বর্ণনা লিখুন

২ নম্বর:

বাম দিকে আপনার সীমাবদ্ধতা চয়ন করুন (যদি একের বেশি থাকে)। তারপরে ডানদিকে, " INSERT এবং আপডেট আপডেট করুন " পয়েন্টটি সঙ্কুচিত করুন এবং আপনার প্রয়োজন অনুসারে মুছার বিধি বা আপডেট বিধি সারি সম্পর্কিত ক্রিয়াগুলি নির্দিষ্ট করুন। এর পরে, ডায়ালগ বক্সটি বন্ধ করুন।

এখানে চিত্র বর্ণনা লিখুন

3 নং:

চূড়ান্ত পদক্ষেপ হ'ল এইগুলি পরিবর্তনগুলি সংরক্ষণ করা (অবশ্যই!)

এখানে চিত্র বর্ণনা লিখুন

PS: আমি অন্য টেবিলের রেফারেন্সকৃত একটি প্রাথমিক কীটি সংশোধন করতে চাইলে এটি আমাকে একগুচ্ছ কাজের হাত থেকে বাঁচিয়েছে।


নিখুঁত, ঠিক আমারও যেমন প্রয়োজন ছিল!
ওয়াইল্ডভিউ

1

আপনি যদি কোনও বিদেশী কী বাদ না দিয়ে পরিবর্তন করতে চান তবে আপনি এটি করতে পারেন:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.