অনুলিপি করা ক্যাসকেড এবং মাইএসকিএলে আপডেট ক্যাসকেডের মধ্যে পার্থক্য


45

আমি মাইএসকিউএল database- দুই টেবিল আছে parent, child। আমি পিতামাতার সারণির উপর ভিত্তি করে আমার সন্তানের টেবিলে বিদেশী কী উল্লেখগুলি যুক্ত করার চেষ্টা করছি। ON UPDATE CASCADEএবং এর মধ্যে কোনও উল্লেখযোগ্য পার্থক্য রয়েছে কি?ON DELETE CASCADE

আমার পিতামাতা সারণী

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

আমার প্রশ্ন হ'ল: নিম্নলিখিত স্কেল কোয়েরির মধ্যে পার্থক্য কী?

  1. ON DELETE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    
  2. ON UPDATE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON UPDATE CASCADE
    ) ENGINE=INNODB;
    
  3. ON UPDATE CASCADE ON DELETE CASCADE

    CREATE TABLE child (
            id INT, 
            parent_id INT,
            INDEX par_ind (parent_id),
            FOREIGN KEY (parent_id) 
                REFERENCES parent(id)
                ON UPDATE CASCADE ON DELETE CASCADE
        ) ENGINE=INNODB;
    

প্রশ্নগুলি মধ্যে কোন ত্রুটি আছে? এই প্রশ্নের (1,2 এবং 3) অর্থ কী ?? তারা কি একই ???


1
সম্পূর্ণতার জন্য << এনটপিক> আপনি উপরে যে বিষয়ে কথা বলছেন তা হ'ল ডিডিএল (ডেটা সংজ্ঞা ভাষা) বিবৃতি , এবং কোয়েরি নয়। একটি প্রশ্নের সাধারণত ডিএমএল হিসাবে বিবেচনা করা হয় (ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ নির্বাচন, INSERT, আপডেট, মুছে ফেলা) </ nitpick>
ভেরাস

আরও একটি পিএস আবার সম্পূর্ণতার জন্য, আমি ভাবলাম যে ডিফল্টটি কী। তাই আমি আপডেটে বা মুছতে না পেয়ে একটি শিশু তৈরি করেছি। তারপরে যা ঘটে তা হ'ল আপনি নির্ভরযোগ্য বাচ্চা হওয়া পিতামাতার আপডেট বা মুছতে পারবেন না। এটি সঠিক ধারণা দেয়, তবে মাইএসকিউএল সর্বদা সেই নির্দিষ্ট বৈশিষ্ট্যের মডেল নয় :-)
ভ্রেস

উত্তর:


64

এই বিষয়ে খুব ভাল থ্রেড এখানে এবং এখানেও পাওয়া যাবে । মাইএসকিউএল-র জন্য চূড়ান্ত গাইডটি অবশ্যই ডকুমেন্টেশন এখানে পাওয়া যাবে

এসকিউএল 2003 স্ট্যান্ডার্ডে 5 টি আলাদা রেফারেনশিয়াল ক্রিয়া রয়েছে:

  1. CASCADE
  2. সীমিত
  3. কোন কর্ম
  4. নাল সেট করুন
  5. নির্ধারিত সেট

প্রশ্নের উত্তর দিতে:

  1. CASCADE

    • ON DELETE CASCADEএর অর্থ হ'ল যদি পিতামাতার রেকর্ডটি মুছে ফেলা হয় তবে যে কোনও শিশু রেকর্ডও মুছে ফেলা হবে। এটি আমার মতে ভাল ধারণা নয় । আপনার ডেটাবেজে থাকা সমস্ত ডেটা ট্র্যাক করে রাখা উচিত, যদিও এটি TRIGGERগুলি ব্যবহার করে করা যেতে পারে । (তবে নীচের মন্তব্যে সাবধানতা অবলম্বন করুন)।

    • ON UPDATE CASCADEএর অর্থ হ'ল যদি পিতামাতার প্রাথমিক কীটি পরিবর্তন করা হয় তবে সন্তানের মানও এটি প্রতিফলিত করতে পরিবর্তিত হবে। আবার আমার মতে, দুর্দান্ত ধারণা নয়। যদি আপনি PRIMARY KEYকোনও নিয়মিততা (বা এমনকি আদৌ!) দিয়ে পরিবর্তন করেন তবে আপনার ডিজাইনে কিছু সমস্যা আছে। আবার, মন্তব্য দেখুন।

    • ON UPDATE CASCADE ON DELETE CASCADEএর অর্থ হ'ল আপনি UPDATE বা DELETE পিতা বা মাতা হলে পরিবর্তনটি সন্তানের কাছে ক্যাসকেড হয়। এটি ANDপ্রথম দুটি বিবৃতি ফলাফলের সমপরিমাণ ।

  2. সীমিত

    • RESTRICTএর অর্থ হল পিতামাতাকে মুছতে এবং / বা আপডেট করার যে কোনও প্রচেষ্টা ত্রুটি ছুঁড়ে ফেলতে ব্যর্থ হবে। কোনও রেফারেন্সিয়াল ক্রিয়া সুস্পষ্টভাবে নির্দিষ্ট না করা ইভেন্টে এটি ডিফল্ট আচরণ।

      একটি ON DELETEবা ON UPDATEএটি নির্দিষ্ট করা হয়নি তার জন্য, ডিফল্ট ক্রিয়া সর্বদা RESTRICT` থাকে `

  3. কোন কর্ম

    • NO ACTION: ম্যানুয়াল থেকে । স্ট্যান্ডার্ড এসকিউএল থেকে একটি কীওয়ার্ড। মাইএসকিউএল এর সমতুল্য RESTRICT। মাইএসকিউএল সার্ভার উল্লেখযোগ্য টেবিলের সাথে সম্পর্কিত কোনও বিদেশী কী মান থাকলে পিতৃ টেবিলের জন্য মোছা বা আপডেট অপারেশনটিকে প্রত্যাখ্যান করে। কিছু ডাটাবেস সিস্টেমে চেক মুলতুবি করে রেখেছিল এবং NO ACTIONএটি একটি মুলতুবি চেক। মাইএসকিউএলে, বিদেশী কী সীমাবদ্ধতাগুলি তাত্ক্ষণিকভাবে পরীক্ষা করা হয়, NO ACTIONএকই রকম RESTRICT
  4. নাল সেট করুন

    • SET NULL- আবার ম্যানুয়াল থেকে। অভিভাবক সারণী থেকে সারিটি মুছুন বা আপডেট করুন এবং শিশু টেবিলের মধ্যে বিদেশী কী কলাম বা কলাম সেট করুন NULL। আইএমএইচও-র মধ্যে এটি সর্বোত্তম নয়, মূলত কারণ "সময়-ভ্রমণের" কোনও উপায় নেই - যেমন শিশু টেবিলে ফিরে দেখা এবং NULLপ্রাসঙ্গিক পিতামহিত রেকর্ডের সাথে রেকর্ডগুলি যুক্ত করে - হয় CASCADEঅথবা TRIGGERলগিং টেবিলগুলি ট্র্যাক করার জন্য ব্যবহার করুন পরিবর্তন (তবে মন্তব্য দেখুন)।
  5. নির্ধারিত সেট

    • SET DEFAULT। এসকিউএল স্ট্যান্ডার্ডের আর একটি (সম্ভাব্য খুব দরকারী) অংশ যা মাইএসকিউএল বাস্তবায়নে বিরক্ত করে না! বিকাশকারীকে কোনও মান আপডেট করতে বা কোনও আপডেট বা ডিলিটে বিদেশী কী কলাম (গুলি) সেট করতে দেয়। InnoDB এবং NDB একটি SET DEFAULTধারা দিয়ে সারণী সংজ্ঞা বাতিল করবে ।

উপরে উল্লিখিত হিসাবে, আপনার এখানে ডকুমেন্টেশন দেখার জন্য কিছুটা সময় ব্যয় করা উচিত ।


8
আমি আপনার সম্পূর্ণ উত্তর পছন্দ করি তবে আমি এই বক্তব্যের সাথে একমত নই। "আপনার কোনও ডাটাবেসে থাকা সমস্ত ডেটা সম্পর্কে নজর রাখা উচিত" - এটি সত্যই ডাটাবেসের নকশা এবং উদ্দেশ্যগুলির উপর নির্ভরশীল। উদাহরণস্বরূপ একটি রেসিপি সংজ্ঞা (আমি খাবারের সাথে কথা বলছি না - সিস্টেম কনফিগারেশনের মতো আরও) যখন রেসিপি সংজ্ঞাটি মুছে ফেলা হয় তখন সেই রেসিপিটির সাথে সম্পর্কিত শিশুদের রাখা কোনও অর্থবোধ করে না - যে কোনও কারণ ছাড়াই কেবল ডিবি ব্লাট করে। মেশিন সিস্টেমগুলির জন্য টেবিলগুলিও কাজ করে - আমার আর ডেটা লাগবে না; প্রক্রিয়া এবং এটি পরিত্রাণ পেতে। তা ছাড়া আপনার উত্তর চমত্কার।
স্টিক্সো

2
@ স্টিক্সোর মতোই আমি এই উত্তরটি বেশিরভাগ ক্ষেত্রেই পছন্দ করি তবে প্রাথমিক কী পরিবর্তন করার সাথে আমার একমত হতে হবে না। এখানে অবশ্যই ডিজাইন রয়েছে যেখানে এটি একটি খারাপ ধারণা হবে তবে আপনি বিতরণকৃত ডাটাবেসে প্রবেশ করলে এটি খুব বাঞ্ছনীয় হতে পারে যে প্রাথমিক কীগুলি কোনও রেকর্ডের পরিচয় না হারিয়েই পুনরায় নিয়োগ দেওয়া মুক্ত।
গ্যারেট ক্লোবার

"এটি আমার মতে ভাল ধারণা নয় You আপনার ডাটাবেসে থাকা সমস্ত ডেটা ট্র্যাক করা উচিত।" - নিশ্চিত নই আমি তোমার কথা বুঝতে পেরেছি। আপনি যদি 'মুছে ফেলার জন্য' ক্যাসকেড করছেন, তবে আপনি ইতিমধ্যে সিদ্ধান্ত নিয়েছেন যে আপনার কোনও কিছু মুছতে হবে। আপনি যদি কখনই কোনও কিছু মুছতে না চান, কিছুই ক্যাসকেড করবে না। যদিও এটি থাকার সুবিধাটি হ'ল আপনার আবেদনে আপনি নিশ্চিত হতে পারেন যে আপনি যখন কোনও বিদেশী আইডি সহ কোনও রেকর্ড সন্ধান করেন, তখন আপনি জানেন যে এটি উপস্থিত থাকবে, এবং কোনও অনাথ সারি আপনার ডাটাবেস ফাটিয়ে দেবে যদি আপনি মুছে ফেলার সিদ্ধান্ত নেন কিছু।
জেফ রায়ান

এখানে যুক্তিটি জায়গাগুলিতে বেশ ত্রুটিযুক্ত এবং আরও আমাদের নতুন জিডিপিআর বিশ্বে। আমি এই ধারণার সাথে একমত নই যে প্রাথমিক কীগুলি যদি পরিবর্তন হয় তবে এটি ভুল কিছু হওয়ার লক্ষণ হতে পারে।
চক লে বাট

আপনি যদি কোনও নিয়মিততা (বা এমনকি কিছু!) দিয়ে প্রাথমিক কীগুলি পরিবর্তন করেন তবে আপনার ডিজাইনে কিছু ভুল আছে। আপনি কী ওপেনডেট ক্যাসকেডের অর্থ কী বা কীটির নাম পরিবর্তন করেছেন?
বিল্লাল বেগেরাদজ

8

এই দু'টি যথাক্রমে সম্পাদন করা কর্ম, যখন প্যারেন্ট টেবিলের রেফারেন্স রেকর্ডটি তার আইডি পরিবর্তন করে এবং এটি মুছে ফেলা হয়।

যদি আপনি কার্যকর করেন:

UPDATE parent SET id = -1 WHERE id = 1;

এবং এর সাথে কমপক্ষে একটি রেকর্ড childরয়েছে parent_id = 1, 1) ব্যর্থ হবে; ক্ষেত্রে 2) এবং 3), প্যারেন্ট_আইডি = 1 সহ সমস্ত রেকর্ডগুলি প্যারেন্ট_আইডি = -1 এ আপডেট করা হয়েছে।

যদি আপনি কার্যকর করেন:

DELETE FROM parent WHERE id = 1;

এবং কমপক্ষে একটি রেকর্ড childআছে parent_id = 1, 2) ব্যর্থ হবে; ক্ষেত্রে 1) এবং 3), এর সাথে সমস্ত রেকর্ড parent_id = 1মুছে ফেলা হয়।

3) সিন্টেক্সিকভাবে সঠিক।

ম্যানুয়ালটিতে সম্পূর্ণ ডকুমেন্টেশন পাওয়া যাবে


6

আগের উত্তরগুলিতে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই। তাই আমি ভেবেছিলাম আমি কিছুটা বিশদভাবে বর্ণনা করব।

1) অনুলিপি ক্যাসকেড মানে পিতামাতার রেকর্ডটি মুছে ফেলা হয়, তবে যে কোনও রেফারেন্সিং শিশু রেকর্ডও মুছে ফেলা হয়। RESTRICT- এ পূর্বনির্ধারিত আপডেটের অর্থ প্যারেন্ট রেকর্ডের আপডেট আপডেট ব্যর্থ হবে।

2) অপসারণ ডিফল্টগুলিতে RESTRICT এর ডিফল্ট, যার অর্থ প্যারেন্ট রেকর্ডে ডিলিট ব্যর্থ হবে। পিতামাতার রেকর্ডটি আপডেট হওয়ার পরে ক্যাসকেডে আপডেট হওয়া সমস্ত রেফারেন্সিং শিশু রেকর্ড আপডেট করা হবে।

3) উপরের ক্যাসকেড ক্রিয়াগুলি দেখুন 1) এবং 2) উপরে।

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

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