কখন "আপডেট আপডেট ক্যাসকেড" ব্যবহার করবেন


420

আমি নিয়মিত "অন ডিলিট ক্যাসকেড" ব্যবহার করি তবে আমি কখনই "ওয়ান আপডেট আপডেট ক্যাসকেড" ব্যবহার করি না কারণ এটি কোন পরিস্থিতিতে কার্যকর হবে তা সম্পর্কে আমি নিশ্চিত নই।

আলোচনার খাতিরে কিছু কোড দেখতে দিন।

CREATE TABLE parent (
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

CREATE TABLE child (
    id INT NOT NULL AUTO_INCREMENT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON DELETE CASCADE
);

"অন idডিলেট ক্যাসকেড" এর জন্য, যদি কোনও পিতামাতার সাথে মুছে ফেলা হয়, তবে সন্তানের একটি রেকর্ড parent_id = parent.idস্বয়ংক্রিয়ভাবে মোছা হবে। এটি কোন সমস্যা হওয়া উচিত।

  1. এর অর্থ idপিতামাতার আপডেট হওয়ার পরে "অন আপডেট আপডেট ক্যাসকেড" একই কাজ করবে ?

  2. (1) সত্য, এটা মানে "আপডেট CASCADE" ব্যবহার করতে যদি কোন প্রয়োজন নেই যে parent.idযখন এটি মত updatable নয় (বা আপডেট করা হবে না) AUTO_INCREMENTবা সবসময় হতে সেট TIMESTAMP। এটা কি সঠিক?

  3. যদি (২) সত্য না হয়, অন্য কোন ধরণের পরিস্থিতিতে আমাদের "ওএন আপডেট আপডেট ক্যাসকেড" ব্যবহার করা উচিত?

  4. যদি আমি (কোনও কারণে) আপডেট না child.parent_idকরে কিছু বিদ্যমান না থাকার জন্য আপডেট করি তবে তা কি স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে?

ঠিক আছে, আমি জানি, উপরের কয়েকটি প্রশ্নাবলীর জন্য পরীক্ষামূলকভাবে পরীক্ষা করা যেতে পারে তবে আমি এটিও জানতে চাই যে এটিগুলির মধ্যে কোনও ডাটাবেস বিক্রেতারা নির্ভরশীল কিনা not

দয়া করে কিছু আলোকপাত করুন।


উত্তর:


468

এটি সত্য যে আপনার প্রাথমিক কীটি যদি কেবল একটি পরিচয়ের মান স্বতঃবৃদ্ধি হয় তবে ওপেনডে ক্যাসকেডের জন্য আপনার কোনও আসল ব্যবহার হবে না।

তবে, আসুন আমরা বলি যে আপনার প্রাথমিক কীটি 10 ​​ডিজিটের ইউপিসি বার কোড এবং প্রসারণের কারণে আপনার এটিকে 13-সংখ্যার ইউপিসি বার কোডে পরিবর্তন করতে হবে। সেক্ষেত্রে, আপডেট আপ ক্যাসকেড আপনাকে প্রাথমিক কী মান পরিবর্তন করতে দেয় এবং মানটির সাথে বিদেশী কী উল্লেখ থাকা যে কোনও সারণী সেই অনুসারে পরিবর্তিত হবে।

# 4 এর প্রসঙ্গে, আপনি যদি সন্তানের আইডিটিকে এমন কোনও কিছুতে পরিবর্তন করেন যা পিতামাতার টেবিলে বিদ্যমান নেই (এবং আপনার রেফারেন্সিয়াল অখণ্ডতা রয়েছে), আপনার উচিত একটি বিদেশী কী ত্রুটি।


6
ON UPDATE CASCADEপুরানো টেবিলের প্রাথমিক কীগুলি আপডেট করতে কেবল নিজেকে ব্যবহার করতে হয়েছিল যা কোনও স্বয়ং-বর্ধিত কী ব্যবহার করে না
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

86
  1. হ্যাঁ, এর অর্থ হল যে উদাহরণস্বরূপ আপনি UPDATE parent SET id = 20 WHERE id = 10সমস্ত বাচ্চাদের 10 এর প্যারেন্ট_আইডি এর সাথে 20 এ আপডেটও করবেন

  2. আপনি যদি ক্ষেত্রটি আপডেট না করেন তবে বিদেশী কী উল্লেখ করে, এই সেটিংটির দরকার নেই

  3. অন্য কোনও ব্যবহারের কথা ভাবতে পারি না।

  4. বিদেশী কী বাধা ব্যর্থ হওয়ায় আপনি এটি করতে পারবেন না।


29

আমি মনে করি আপনি অনেকটা পয়েন্ট পেরেক করেছেন!

আপনি যদি ডাটাবেস ডিজাইনের সেরা অনুশীলনগুলি অনুসরণ করেন এবং আপনার প্রাথমিক কীটি কখনই আপডেটযোগ্য হয় না (যা আমি মনে করি যে যাইহোক সর্বদা এটি হওয়া উচিত) তবে আপনার কখনই সত্যিই ON UPDATE CASCADEধারাটির প্রয়োজন হবে না ।

জেড একটি ভাল কথা বলেছে যে আপনি যদি একটি প্রাকৃতিক কী (যেমন আপনার ডাটাবেস টেবিলের থেকে একটি নিয়মিত ক্ষেত্র) আপনার প্রাথমিক কী হিসাবে ব্যবহার করেন তবে কিছু পরিস্থিতিতে আপনার প্রাথমিক কীগুলি আপডেট করার দরকার হতে পারে। আর একটি সাম্প্রতিক উদাহরণ আইএসবিএন (আন্তর্জাতিক স্ট্যান্ডার্ড বুক নাম্বার) হবে যা খুব বেশি আগে না হয়ে 10 থেকে 13 ডিজিটের + অক্ষর থেকে পরিবর্তিত হয়েছিল।

আপনি যদি সার্োগেট ব্যবহার করতে চান তবে এটি ক্ষেত্রে নয় (যেমন artifically সিস্টেম-উত্পন্ন) আপনার প্রাথমিক কী হিসাবে কি-সংকলন (যা সব আমার পছন্দের পছন্দ কিন্তু অধিকাংশ বিরল অনুষ্ঠান হবে)।

সুতরাং শেষ পর্যন্ত: যদি আপনার প্রাথমিক কীটি কখনই পরিবর্তন হয় না, তবে আপনার কখনই ON UPDATE CASCADEধারাটির প্রয়োজন হবে না ।

আঙ্গুরের ছিরড়া


"কৃত্রিমভাবে সিস্টেম-উত্পন্ন" কীগুলি কী? UUID জানা?
এইচপিডাব্লুডি

1
@HPWD: শুধু একটি "কৃত্রিম" কী যা সিস্টেমের দ্বারা উত্পন্ন করা হয় (একটি মান উপর ভিত্তি অথবা আপনার প্রকৃত তথ্য থেকে প্রাপ্ত হয় না) - এটা হতে পারে সত্যিই কিছু - - একটি GUID, অথবা কোন int, অথবা একটি BIGINT ফেলে না ব্যাপার না। পয়েন্টটি হল: সেই মানটি কোনওভাবেই আপনার নিজের, প্রকৃত ডেটার সাথে সম্পর্কিত নয় - এবং সিস্টেমটি আপনার জন্য স্বয়ংক্রিয়ভাবে সেই মানটি তৈরি করে।
marc_s

@ মার্ক-এস এটি লেখার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। আপনার উত্তর নিখুঁত অর্থে তৈরি হয়েছে।
এইচপিডাব্লুডি

2
প্রাকৃতিক কীগুলির সাথে একটি একক-কলামের সারণীটি আমার মতে এনামগুলির (কমপক্ষে মাইএসকিউএল ডিবি স্বাদে) একটি ভাল এবং পরিষ্কার বিকল্প। উদাহরণস্বরূপ, একটি টেবিল বিবেচনা colorsসারি দিয়ে blue, purple, yellow, এবং একটি টেবিল productsএকটি সঙ্গে product_colorকলাম, এর FK'ed হচ্ছে colorsটেবিল। এটি এনামের মতো পছন্দগুলি সীমাবদ্ধ করে, তবে একটি স্বয়ং-বর্ধক পূর্ণসংখ্যার বিপরীতে রঙের নাম পেতে এটির যোগদানের প্রয়োজন হয় না। যেমন একটি ক্ষেত্রে, on update cascadeএকটি ভাল ধারণা, যদি আপনি সিদ্ধান্ত নেন যে পরিবর্তে purpleবলা উচিত violet
Okdewit

18

কিছু দিন আগে আমার ট্রিগারগুলির সাথে একটি সমস্যা হয়েছিল এবং আমি বুঝতে ON UPDATE CASCADEপারি যে এটি কার্যকর হতে পারে। এই উদাহরণটি দেখুন (পোস্টগ্রিএসকিউএল):

CREATE TABLE club
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE band
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE concert
(
    key SERIAL PRIMARY KEY,
    club_name TEXT REFERENCES club(name) ON UPDATE CASCADE,
    band_name TEXT REFERENCES band(name) ON UPDATE CASCADE,
    concert_date DATE
);

আমার ইস্যুতে, কনসার্টের টেবিলটি আপডেট করার জন্য আমাকে কিছু অতিরিক্ত ক্রিয়াকলাপ (ট্রিগার) সংজ্ঞায়িত করতে হয়েছিল। এই ক্রিয়াকলাপগুলিতে ক্লাব_নাম এবং ব্যান্ড_নাম পরিবর্তন করতে হয়েছিল। রেফারেন্সের কারণে আমি এটি করতে অক্ষম ছিলাম। আমি কনসার্টটি পরিবর্তন করতে পারি না এবং তারপরে ক্লাব এবং ব্যান্ড টেবিলগুলি নিয়ে কাজ করতে পারি। আমি এটি অন্যভাবে করতে পারি না। ON UPDATE CASCADEসমস্যা সমাধানের মূল চাবিকাঠি ছিল।


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

4
এটি একটি প্রশ্নোত্তর নকশা যা একটি বরং স্বীকৃত উদাহরণ তৈরি করে। আপনি যদি প্রতিটি টেবিলের প্রাথমিক কীটির পরিবর্তে দুটি রেফারেন্স উল্লেখ করেন তবে প্রাথমিক কী হিসাবে দুটি SERIALকলাম রাখতে হবে clubএবং কী আছে? bandname
এসএম

সংক্ষেপে, আপনি যদি অন্য টেবিল থেকে ক্ষেত্রটি নকল করে থাকেন এবং এটি আপ টু ডেট হওয়ার প্রয়োজন হয় তবে এটি দরকারী।
কামিল তোমাক

4

আমার মন্তব্যটি মূলত # 3 পয়েন্টের প্রসঙ্গে: আমরা কীভাবে ধরে নিচ্ছি যে প্যারেন্ট কীটি আপডেটযোগ্য নয়? এখানে একটি কেস দেওয়া আছে।

আমি একটি প্রতিরূপ দৃশ্য নিয়ে কাজ করছি যেখানে একাধিক উপগ্রহ ডেটাবেসগুলি মাস্টারের সাথে একত্রীকরণ করা দরকার। প্রতিটি উপগ্রহ একই টেবিলগুলিতে ডেটা উৎপন্ন করে, তাই সারণীর সাথে টেবিলগুলি মার্জ করা স্বতন্ত্রতা সীমাবদ্ধতার লঙ্ঘনের দিকে পরিচালিত করে। আমি সমাধানের অংশ হিসাবে আপডেট ক্যাসকেড ব্যবহার করার চেষ্টা করছি যাতে প্রতিটি সংশ্লেষের সময় আমি কীগুলি পুনরায় বর্ধিত করি। আপসেট ক্যাসকেডে প্রক্রিয়াটির অংশটি স্বয়ংক্রিয় করে এই প্রক্রিয়াটি সহজ করা উচিত।


3

এটি একটি দুর্দান্ত প্রশ্ন, গতকাল আমারও একই প্রশ্ন ছিল। আমি এই সমস্যাটি সম্পর্কে ভেবেছিলাম, বিশেষত অনুসন্ধান করা থাকলে "ওয়ান আপডেট আপডেট ক্যাসকেড" এর মতো কিছু থাকে এবং ভাগ্যক্রমে এসকিউএল এর ডিজাইনাররাও সে সম্পর্কে ভেবেছিলেন। আমি টেড.স্ট্রাউসের সাথে একমত, এবং আমি নুরানের ক্ষেত্রেও মন্তব্য করেছি।

আমি কখন এটি ব্যবহার করেছি? টেড নির্দেশিত মত, যখন আপনি এক সাথে একাধিক ডাটাবেস চিকিত্সা করছেন, এবং একটি টেবিলে, তার মধ্যে একটিতে সংশোধন করে টেডকে "স্যাটেলাইট ডাটাবেস" বলে কোনও প্রকারের পুনরুত্পাদন আছে, একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একে একের সাথে একত্রিত করতে হবে না T আইডি, এবং কোনও কারণে আপনাকে একটি নতুন তৈরি করতে হবে, যদি আপনি পুরানোটির উপর ডেটা আপডেট করতে না পারেন (উদাহরণস্বরূপ অনুমতিগুলির কারণে, বা আপনি যদি এমন ক্ষেত্রে দ্রুততার সন্ধান করছেন যা এতই সংক্ষেপে সাধারণীকরণের মোট নিয়মগুলির জন্য নিরঙ্কুশ ও নিখুঁত শ্রদ্ধার প্রাপ্য নয়, কেবল কারণ এটি খুব স্বল্প-কালীন উপযোগিতা হবে)

সুতরাং, আমি দুটি দফায় একমত:

(এ) হ্যাঁ, অনেক সময় আরও ভাল ডিজাইন এড়াতে পারে; কিন্তু

(খ) মাইগ্রেশন, ডাটাবেসগুলির অনুলিপি করা বা জরুরী পরিস্থিতি সমাধানের ক্ষেত্রে এটি একটি দুর্দান্ত সরঞ্জাম যা আমি সেখানে উপস্থিত থাকলে সন্ধানে গিয়েছিলাম ভাগ্যক্রমে সেখানে।

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