বিদেশী কী বাধাগুলির পুরো বিষয়টি: এগুলি আপনাকে রেফারেন্সিয়াল অখণ্ডতা বজায় রাখার জন্য অন্য কোথাও উল্লেখ করা ডেটা মুছে ফেলা বন্ধ করে দেয়।
দুটি বিকল্প রয়েছে:
INVENTORY_ITEMS
প্রথম থেকে সারিগুলি মুছুন , তারপরে সারিগুলি STOCK_ARTICLES
।
ON DELETE CASCADE
মূল সংজ্ঞায় এর জন্য ব্যবহার করুন ।
1: সঠিক অর্ডার মুছে ফেলা হচ্ছে
এটি করার সর্বাধিক দক্ষ উপায় কোয়েরির জটিলতার উপর নির্ভর করে যা কোন সারিগুলি মুছবে তা স্থির করে। একটি সাধারণ প্যাটার্ন হতে পারে:
BEGIN TRANSACTION
SET XACT_ABORT ON
DELETE INVENTORY_ITEMS WHERE STOCK_ARTICLE IN (<select statement that returns stock_article.id for the rows you are about to delete>)
DELETE STOCK_ARTICLES WHERE <the rest of your current delete statement>
COMMIT TRANSACTION
এটি সাধারণ জিজ্ঞাসার জন্য বা একটি একক স্টক আইটেম মুছে ফেলার জন্য ঠিক আছে, তবে আপনার মুছে ফেলার বিবৃতিতে এমন একটি WHERE NOT EXISTS
ক্লজ বাসা বেঁধে রয়েছে যা ভিতরে WHERE IN
একটি খুব অদক্ষ পরিকল্পনা তৈরি করতে পারে তাই একটি বাস্তবসম্মত ডেটা সেট আকারের সাথে পরীক্ষা করে প্রয়োজনে কোয়েরিটিকে পুনরায় সাজিয়ে তুলতে পারে।
লেনদেনের বিবৃতিগুলিও নোট করুন: আপনি নিশ্চিত করতে চান যে মোছা দুটিই সম্পূর্ণ হয়েছে বা সেগুলি দুটিও সম্পন্ন করে না। যদি অপারেশনটি ইতিমধ্যে কোনও লেনদেনের মধ্যেই ঘটে থাকে তবে আপনার বর্তমান লেনদেন এবং ত্রুটি পরিচালনার প্রক্রিয়াটি মেলে আপনাকে অবশ্যই এটি পরিবর্তন করতে হবে।
2: ব্যবহার করুন ON DELETE CASCADE
আপনি যদি আপনার বিদেশী কীতে ক্যাসকেড বিকল্পটি যুক্ত করেন তবে এসকিউএল সার্ভার স্বয়ংক্রিয়ভাবে আপনার জন্য এটি করবে, সীমাগুলি INVENTORY_ITEMS
সীমাবদ্ধতা সরিয়ে নেওয়ার জন্য সরিয়ে ফেলা হবে যেগুলি আপনি মুছে ফেলছেন তার সারিগুলির কোনও উল্লেখ করা উচিত নয়। ঠিক এর ON DELETE CASCADE
মতো এফকে সংজ্ঞা যুক্ত করুন :
ALTER TABLE <child_table> WITH CHECK
ADD CONSTRAINT <fk_name> FOREIGN KEY(<column(s)>)
REFERENCES <parent_table> (<column(s)>)
ON DELETE CASCADE
এখানে একটি সুবিধা হ'ল মোছা হ'ল একটি পারমাণবিক বিবৃতি হ্রাস করা (যদিও, যথারীতি, 100% অপসারণ নয়) লেনদেন এবং লক সেটিংস সম্পর্কে উদ্বেগের প্রয়োজন। কাসকেড এমনকি একাধিক পিতামাতা / শিশু / গ্র্যান্ড-চাইল্ড / ... স্তরের উপরেও পরিচালনা করতে পারে যদি পিতা বা মাতা এবং সমস্ত বংশধরদের মধ্যে কেবল একটি পাথ থাকে (যেখানে এটি কার্যকর না পারে তার উদাহরণগুলির জন্য "একাধিক ক্যাসকেড পাথ" অনুসন্ধান করুন)।
দ্রষ্টব্য: আমি এবং আরও অনেকে, ক্যাসকেড মুছে ফেলাগুলি বিপজ্জনক বলে মনে করি সুতরাং আপনি যদি এই অপশনটি ব্যবহার করেন তবে এটির সঠিকভাবে আপনার ডাটাবেস ডিজাইনে নথী করার জন্য যত্নবান হন যাতে আপনি এবং অন্যান্য বিকাশকারীরা পরে বিপদটি কাটাতে পারেন না । আমি এই কারণে যেখানেই সম্ভব ক্যাসকেডিং মোছা এড়াতে চাই।
ক্যাসকেড মুছে ফেলাগুলির সাথে সৃষ্ট একটি সাধারণ সমস্যা হ'ল যখন কেউ UPDATE
বা ব্যবহারের পরিবর্তে সারিগুলি বাদ দিয়ে এবং পুনরায় তৈরি করে ডেটা আপডেট করে MERGE
। এটি প্রায়শই দেখা যায় যেখানে "ইতিমধ্যে বিদ্যমান সারিগুলি আপডেট করুন, যা সারণিগুলি সন্নিবেশ করান" (কখনও কখনও ইউপিএসইআরটি অপারেশন নামে পরিচিত) প্রয়োজন হয় এবং MERGE
বিবৃতি সম্পর্কে অসচেতন লোকেরা এটি করা সহজ করে:
DELETE <all rows that match IDs in the new data>
INSERT <all rows from the new data>
চেয়ে
-- updates
UPDATE target
SET <col1> = source.<col1>
, <col2> = source.<col2>
...
, <colN> = source.<colN>
FROM <target_table> AS target JOIN <source_table_or_view_or_statement> AS source ON source.ID = target.ID
-- inserts
INSERT <target_table>
SELECT *
FROM <source_table_or_other> AS source
LEFT OUTER JOIN
<target_table> AS target
ON target.ID = source.ID
WHERE target.ID IS NULL
এখানে সমস্যাটি হ'ল মোছার বিবৃতিটি শিশুদের সারিগুলিতে ক্যাসকেড করবে এবং সন্নিবেশ বিবৃতিটি তাদের পুনরায় তৈরি করবে না, তাই পিতামাতার সারণি আপডেট করার সময় আপনি ঘটনাক্রমে শিশু টেবিল (গুলি) থেকে ডেটা হারাবেন।
সারসংক্ষেপ
হ্যাঁ, আপনাকে প্রথমে সন্তানের সারিগুলি মুছতে হবে।
সেখানে অন্য কোনো বিকল্প নেই: ON DELETE CASCADE
।
তবে ON DELETE CASCADE
বিপজ্জনক হতে পারে , তাই যত্ন সহ ব্যবহার করুন।
পার্শ্ব দ্রষ্টব্য: যখন আপনার কোনও অপারেশন প্রয়োজন হয় তখন ব্যবহার করুন MERGE
(বা- UPDATE
এবং- INSERT
যেখানে MERGE
উপলব্ধ নেই) ব্যবহার না করে অন্য লোকেরা যে ফাঁদে পড়েছেন তাতে আটকাতে না -বদলে প্রতিস্থাপন করুন ।UPSERT
DELETE
INSERT
ON DELETE CASCADE
INVENTORY_ITEMS
দু'জনের মধ্যে নতুন সংযোজন হিসাবে ত্রুটি দেখতে পাবেনDELETE
।