প্রথম
: আপনি সম্ভবত সব তিনটি কলাম প্রয়োজন হবে না old_id
, external_id
, new_id
। new_id
কলাম, একটি হচ্ছে IDENTITY
, প্রতিটি সারিতে একটি নতুন মান এমনকি যখন আপনি মধ্যে সন্নিবেশ থাকবে, external_id
। কিন্তু, মধ্যে old_id
এবং external_id
সেই প্রায় কাছাকাছি পারস্পরিক একচেটিয়া: হয় সেখানে আগে থেকেই একটি old_id
মান বা যে কলাম, বর্তমান ধারণা, যে হবে NULL
যদি ব্যবহার external_id
বা new_id
। যেহেতু আপনি ইতিমধ্যে বিদ্যমান একটি সারিতে নতুন "বাহ্যিক" আইডি যুক্ত করবেন না (যেমন একটি old_id
মান রয়েছে), এবং কোনও নতুন মান আসবে না old_id
, তারপরে একটি কলাম ব্যবহার করা যেতে পারে উভয় উদ্দেশ্যে।
সুতরাং, external_id
কলামটি থেকে মুক্তি পেয়ে নতুন নামকরণ old_id
করুন যা কিছু old_or_external_id
বা যা কিছু হোক। এটির জন্য কোনও কিছুর আসল পরিবর্তনের প্রয়োজন হবে না, তবুও কিছু জটিলতা হ্রাস করতে পারে। external_id
অ্যাপ্লিকেশন কোডটি সন্নিবেশ করানোর জন্য ইতিমধ্যে লিখিত থাকলেও আপনাকে সম্ভবত কলামটি কল করতে হবে , যদিও এতে "পুরানো" মান রয়েছে external_id
।
এটি নতুন কাঠামোকে ন্যায়সঙ্গত হতে হ্রাস করে:
PkId AS AS COALESCE(old_or_external_id, new_id, -1) PERSISTED NOT NULL,
old_or_external_id INT NULL, -- values from existing record OR passed in from app
new_id INT IDENTITY(2000000, 1) NOT NULL
এখন আপনি 12 বাইটের পরিবর্তে সারি প্রতি 8 বাইট যুক্ত করেছেন (ধরে নিবেন যে আপনি SPARSE
বিকল্প বা ডেটা সংক্ষেপণটি ব্যবহার করছেন না )। এবং আপনার কোনও কোড, টি-এসকিউএল বা অ্যাপ কোড পরিবর্তন করার দরকার নেই।
SECOND এ
সরলকরণের এই পথ অব্যাহত রেখে, আসুন আমরা কী রেখেছি তা দেখুন:
old_or_external_id
কলাম হয় ইতোমধ্যে মান আছে, অথবা অ্যাপ্লিকেশন থেকে কোনো নতুন মান দেওয়া হবে, অথবা ছেড়ে দেওয়া হবে NULL
।
new_id
সবসময় একটি নতুন মান থাকবে, কিন্তু যদি যে মান শুধুমাত্র ব্যবহার করা হবে old_or_external_id
কলাম NULL
।
একটা সময় ছিল যখন আপনি উভয় মান হবে না হয় old_or_external_id
এবং new_id
। উভয় কলাম কারণে মান আছে হ্যাঁ, বার হতে হবে new_id
একটি হচ্ছে IDENTITY
, কিন্তু সেসব new_id
মান উপেক্ষা করা হয়। আবার এই দুটি ক্ষেত্র পারস্পরিক একচেটিয়া। এখন কি?
এখন আমরা কেন external_id
প্রথমে আমাদের প্রয়োজনের বিষয়টি খতিয়ে দেখতে পারি । এটি IDENTITY
ব্যবহার করে কলামে toোকানো সম্ভব তা বিবেচনা করে SET IDENTITY_INSERT {table_name} ON;
আপনি কোনও স্কিমার কোনও পরিবর্তন না করেই পালিয়ে যেতে পারতেন এবং INSERT
বিবৃতি / ক্রিয়াকলাপগুলিকে SET IDENTITY_INSERT {table_name} ON;
এবং SET IDENTITY_INSERT {table_name} OFF;
বিবৃতিগুলিকে মোড়ানোর জন্য কেবল আপনার অ্যাপ কোডটি সংশোধন করতে পারেন । তারপরে আপনাকে IDENTITY
কলামটি পুনরায় সেট করার জন্য কোন প্রারম্ভিক ব্যাপ্তিটি নির্ধারণ করতে হবে (সদ্য উত্পন্ন মানগুলির জন্য) কারণ অ্যাপ্লিকেশন কোডটি যে মানগুলি সন্নিবেশ করানো হবে তার চেয়ে ভাল হওয়া দরকার যেহেতু একটি উচ্চতর মান সন্নিবেশ করানো পরের স্বয়ংক্রিয়ভাবে উত্পন্ন মানটির কারণ হবে বর্তমানের MAX মানের চেয়ে বড় হতে হবে। তবে আপনি সর্বদা IDENT_CURRENT মানের নীচে থাকা একটি মান সন্নিবেশ করতে পারেন ।
2 এবং এমনকি 3 এর অভিপ্রায় থেকে কলামগুলি old_or_external_id
এবং new_id
কলামগুলির সংমিশ্রণটি স্বতঃ উত্পাদিত মান এবং অ্যাপ্লিকেশন-উত্পাদিত মানগুলির মধ্যে ওভারল্যাপিং মান পরিস্থিতির দিকে পরিচালিত হওয়ার সম্ভাবনা বৃদ্ধি করে না, কলামগুলি তাদের একটি প্রাথমিক কী মানের সাথে একত্রিত করা, এবং সেগুলি সর্বদা অনন্য মান।
এই পদ্ধতির ক্ষেত্রে, আপনার কেবল দরকার:
হিসাবে টেবিলগুলি ছেড়ে দিন:
PkId INT IDENTITY(1,1) PRIMARY KEY
এটি 8 বা 12 এর পরিবর্তে প্রতিটি সারিতে 0 বাইট যুক্ত করে।
- অ্যাপ্লিকেশন-উত্পাদিত মানগুলির জন্য প্রারম্ভিক ব্যাপ্তি নির্ধারণ করুন। এগুলি প্রতিটি টেবিলের বর্তমান MAX মানের চেয়ে বেশি হবে তবে স্বয়ংক্রিয়ভাবে উত্পন্ন মানগুলির জন্য সর্বনিম্ন মান হয়ে উঠবে তার চেয়ে কম।
- স্বতঃ উত্পাদিত পরিসীমাটি কী থেকে শুরু হওয়া উচিত তা নির্ধারণ করুন। বর্তমানের ম্যাক্স মান এবং বাড়ার জন্য প্রচুর কক্ষের মধ্যে প্রচুর জায়গা থাকতে হবে, উপরের সীমাতে জেনে মাত্র ২.১৪ বিলিয়ন over তারপরে আপনি এই নতুন সর্বনিম্ন বীজ মানটি ডিবিসিসি চেকিডেন্টের মাধ্যমে নির্ধারণ করতে পারেন ।
- অ্যাপ কোড INSERT গুলি
SET IDENTITY_INSERT {table_name} ON;
এবং SET IDENTITY_INSERT {table_name} OFF;
বিবৃতি মোড়ানো W
দ্বিতীয়, খণ্ড বি
উপরে উল্লিখিত পদ্ধতির পরিবর্তনে হ'ল অ্যাপ কোড সন্নিবেশ মানগুলি -1 দিয়ে শুরু হবে এবং সেখান থেকে নীচে নামবে । এর ফলে IDENTITY
মানগুলি কেবলমাত্র উপরে চলে যায় । এখানে সুবিধাটি হ'ল আপনি কেবল স্কিমাটিকে জটিল করবেন না, আপনাকে ওভারল্যাপিং আইডিগুলিতে চলার বিষয়েও চিন্তা করার দরকার নেই (যদি অ্যাপ্লিকেশন-উত্পন্ন মানগুলি নতুন স্বয়ংক্রিয়ভাবে উত্পাদিত পরিসীমাতে চালিত হয়)। এটি কেবলমাত্র একটি বিকল্প যদি আপনি ইতিমধ্যে নেতিবাচক আইডি মান ব্যবহার করছেন না (এবং এটি স্বয়ংক্রিয়ভাবে উত্পন্ন কলামগুলিতে নেতিবাচক মান ব্যবহার করা খুব বিরল বলে মনে হয় তাই বেশিরভাগ পরিস্থিতিতে এটি সম্ভবত সম্ভাবনাময় হওয়া উচিত)।
এই পদ্ধতির ক্ষেত্রে, আপনার কেবল দরকার:
হিসাবে টেবিলগুলি ছেড়ে দিন:
PkId INT IDENTITY(1,1) PRIMARY KEY
এটি 8 বা 12 এর পরিবর্তে প্রতিটি সারিতে 0 বাইট যুক্ত করে।
- অ্যাপ্লিকেশন-উত্পাদিত মানগুলির জন্য প্রারম্ভিক ব্যাপ্তি হবে
-1
।
- অ্যাপ কোড INSERT গুলি
SET IDENTITY_INSERT {table_name} ON;
এবং SET IDENTITY_INSERT {table_name} OFF;
বিবৃতি মোড়ানো W
এখানে আপনার এখনও করতে হবে IDENTITY_INSERT
, তবে: আপনি কোনও নতুন কলাম যুক্ত করবেন না IDENTITY
, কোনও কলামকে "পুনরায় গবেষণা" করতে হবে না এবং ভবিষ্যতে ওভারল্যাপের ঝুঁকি নেই।
দ্বিতীয়, অংশ 3
এই পদ্ধতির একটি সর্বশেষ প্রকরণটি সম্ভবত IDENTITY
কলামগুলি সরিয়ে আনা এবং তার পরিবর্তে সিকোয়েন্সগুলি ব্যবহার করা হবে । এই পদ্ধতির গ্রহণের কারণটি হ'ল অ্যাপ কোডটি সন্নিবেশ করা মানগুলি সক্ষম করতে সক্ষম হবেন: ইতিবাচক, স্বতঃ উত্পাদিত পরিসরের উপরে (নীচে নয়) এবং প্রয়োজন নেই SET IDENTITY_INSERT ON / OFF
।
এই পদ্ধতির ক্ষেত্রে, আপনার কেবল দরকার:
- ক্রিয়েট সিকোয়েন্স ব্যবহার করে সিকোয়েন্স তৈরি করুন
IDENTITY
নতুন কলামে কলামটি অনুলিপি করুন যেখানে IDENTITY
সম্পত্তি নেই, তবে ফাংশনটির জন্য নেক্সটDEFAULT
ভ্যালু ব্যবহার করে কোনও সীমাবদ্ধতা রয়েছে :
PkId INT PRIMARY KEY CONSTRAINT [DF_TableName_NextID] DEFAULT (NEXT VALUE FOR...)
এটি 8 বা 12 এর পরিবর্তে প্রতিটি সারিতে 0 বাইট যুক্ত করে।
- অ্যাপ্লিকেশন-উত্পাদিত মানগুলির জন্য প্রারম্ভিক ব্যাপ্তি স্বয়ংক্রিয়ভাবে উত্পন্ন মূল্যবোধগুলির কাছাকাছি আসবে বলে আপনি ঠিক তার উপরে চলে যাবেন।
- অ্যাপ কোড INSERT গুলি
SET IDENTITY_INSERT {table_name} ON;
এবং SET IDENTITY_INSERT {table_name} OFF;
বিবৃতি মোড়ানো W
তা যে , প্রয়োজন যে হয় সঙ্গে কোডের কারণে SCOPE_IDENTITY()
বা @@IDENTITY
এখনও ফাংশন সঠিকভাবে, সিকোয়েন্স স্যুইচ বর্তমানে একটি বিকল্প হিসাবে দেখা সিকোয়েন্স জন্য :-( যারা ফাংশন কোন সমতূল্য যে নেই। দুঃখি!