পরিচয় কলামে অপ্রত্যাশিত ফাঁক


18

আমি অনন্য ক্রয় অর্ডার নম্বর উত্পন্ন করার চেষ্টা করছি যা 1 থেকে শুরু হয় এবং 1 দ্বারা বৃদ্ধি হয় I আমার কাছে এই স্ক্রিপ্টটি ব্যবহার করে একটি পোনম্বার টেবিল তৈরি করা হয়েছে:

CREATE TABLE [dbo].[PONumbers]
(
  [PONumberPK] [int] IDENTITY(1,1) NOT NULL,
  [NewPONo] [bit] NOT NULL,
  [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
  CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)    
);

এবং এই স্ক্রিপ্টটি ব্যবহার করে একটি সঞ্চিত পদ্ধতি:

CREATE PROCEDURE [dbo].[GetPONumber] 
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
    SELECT SCOPE_IDENTITY() AS PONumber;
END

সৃষ্টির সময়, এটি দুর্দান্ত কাজ করে। সঞ্চিত পদ্ধতিটি চললে, এটি পছন্দসই সংখ্যায় শুরু হয় এবং 1 দ্বারা বৃদ্ধি হয়।

আশ্চর্যের বিষয়টি হ'ল, আমি যদি আমার কম্পিউটারটি বন্ধ করে রাখি বা হাইবারনেট করি, তবে পরবর্তী সময় প্রক্রিয়াটি চালানোর পরে, ক্রমটি প্রায় 1000 দ্বারা এগিয়ে গেছে advanced

নীচে ফলাফল দেখুন:

পিও নম্বর

আপনি দেখতে পাচ্ছেন যে সংখ্যাটি 8 থেকে 1002 এ চলে গেছে!

  • ইহা কি জন্য ঘটিতেছে?
  • আমি কীভাবে নিশ্চিত করব যে সংখ্যাগুলি এর মতো এড়ানো যায় না?
  • এসকিউএল এর জন্য যে সংখ্যাগুলি উত্পন্ন করা দরকার তা হ'ল:
    • ক) গ্যারান্টিযুক্ত অনন্য।
    • খ) কাঙ্ক্ষিত পরিমাণ দ্বারা বৃদ্ধি।

আমি স্বীকার করি আমি কোনও এসকিউএল বিশেষজ্ঞ নই। SCOPE_IDENTITY () কী করে আমি ভুল বুঝি? আমার কি আলাদা পদ্ধতি ব্যবহার করা উচিত? আমি এসকিউএল ২০১২+ এর সিকোয়েন্সগুলিতে দেখেছি, তবে মাইক্রোসফ্ট বলেছে যে তারা ডিফল্টরূপে অনন্য হওয়ার নিশ্চয়তা দেয় না।

উত্তর:


25

এটি একটি পরিচিত এবং প্রত্যাশিত সমস্যা - এসকিউএল সার্ভার দ্বারা পরিচয় কলামগুলি যেভাবে পরিচালিত হয় তা এসকিউএল সার্ভার ২০১২ ( কিছু পটভূমি ) এ পরিবর্তিত হয়েছে ; ডিফল্টরূপে এটি 1000 টি মানকে ক্যাশে করবে এবং আপনি যদি এসকিউএল সার্ভারটি পুনরায় চালু করেন, সার্ভারটি পুনরায় বুট করেন, ব্যর্থ হয়ে যান ইত্যাদি it 1000 মানগুলি ফেলে দিতে হবে, কারণ এটির সত্যিকারের পরিমাণগুলি কী ছিল তা জানার কোনও নির্ভরযোগ্য উপায় নেই won't জারি করেন। এটি এখানে নথিভুক্ত করা হয় । একটি ট্রেস পতাকা রয়েছে যা এই আচরণটি পরিবর্তিত করে যে প্রতিটি আইডেন্টিটি অ্যাসাইনমেন্ট লগড থাকে * specific নির্দিষ্ট ফাঁকগুলি রোধ করে (তবে রোলব্যাক বা মুছতে ফাঁক নয়); তবে, এটি লক্ষ করা গুরুত্বপূর্ণ যে পারফরম্যান্সের দিক থেকে এটি বেশ ব্যয়বহুল হতে পারে, তাই আমি এখানে নির্দিষ্ট ট্রেস পতাকাটি উল্লেখ করতে যাচ্ছি না।

* (ব্যক্তিগতভাবে, আমি মনে করি এটি একটি প্রযুক্তিগত সমস্যা যা অন্যরকমভাবে সমাধান করা যেতে পারে, তবে যেহেতু আমি ইঞ্জিনটি লিখি না, আমি এটি পরিবর্তন করতে পারি না))

আইডেন্টিটি এবং সিকোয়েন্সি কীভাবে কাজ করে সে সম্পর্কে পরিষ্কার হতে:

  • উভয়ই অনন্য হওয়ার নিশ্চয়তা নেই (প্রাথমিক টেবিলে বা অনন্য সীমাবদ্ধতা ব্যবহার করে আপনাকে টেবিল স্তরে এটি প্রয়োগ করতে হবে)
  • উভয়ই ফাঁকবিহীন হওয়ার নিশ্চয়তা নেই (কোনও রোলব্যাক বা মোছা, উদাহরণস্বরূপ, একটি ফাঁক তৈরি করবে, এই নির্দিষ্ট সমস্যা সত্ত্বেও)

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

এই "সমস্যা" নিয়ে প্রচুর পটভূমি:


এই উত্তরটি ("ট্রেস ফ্ল্যাগ" অংশ ব্যতীত) বেশিরভাগ এসকিউএল ডাটাবেসে (যেভাবে সিকোয়েন্স রয়েছে সেগুলিতে) প্রযোজ্য।
মুস্তাকিয়ো

উত্তরের জন্য ধন্যবাদ. স্বতন্ত্রতা একক সবচেয়ে গুরুত্বপূর্ণ প্রয়োজন। গ্যাপগুলি যতক্ষণ না বড় হয় ততক্ষণ বড় বিষয় নয় n't যেমন 1 থেকে 4 এ যাওয়া গ্রহণযোগ্য হবে তবে 4 থেকে 1003 পর্যন্ত তা গ্রহণ করবে না।
এজ এরজোজ

1
সংক্ষিপ্ত সংস্করণ: আইডি মানগুলি ক্রয় ক্রমের নম্বর হিসাবে ব্যবহৃত হবে। গ্রাহক মাসিক প্রতিবেদন পরিচালনা করে এবং কেবলমাত্র PO নম্বর দেখে সেই মাসে কতজন PO জমা দেওয়া হয়েছিল তা দ্রুত বলতে সক্ষম হতে চায়। সুতরাং আমরা এটির 1000 ডলার বৃদ্ধি করতে পারি না (একটি সাপ্তাহিক রক্ষণাবেক্ষণ রয়েছে যেখানে ডিবি সার্ভার সহ সমস্ত সার্ভার পুনরায় চালু করা হয়েছে)।
এজ এরজোজ

3
আপনি কেন তাদের খুব সহজ প্রতিবেদন দিচ্ছেন না যা কেবল ROW_NUMBER () ওভার (মাসিক অর্ডার বা আইডি দ্বারা পার্টিশন) ব্যবহার করে? আবার, আইডি নম্বরটি অর্থহীন হওয়া উচিত, এটি কতটা অর্ডার নেওয়া হয়েছিল তা চোখের সামনে a আপনার কোডটিতে যদি এমন একটি বাগ থাকে যা 1000 সারি মুছে ফেলে বা 275 টি লেনদেনকে পিছনে ফেলে বা 500 টি অর্ডার বৈধভাবে বাতিল হয়ে যায়?
অ্যারন বারট্র্যান্ড

1
@ এজ: "... কতজনকে বলুন ... শুধু পিও নম্বর দেখে" " আপনার ব্যবহারকারীরা হতাশ হতে চলেছেন। সনাক্তকরণের মানগুলি কেবল সেভাবে কাজ করে না বা আপনার (বা তারা) এমন কোনও ধারণা করা উচিত নয়। একটি স্বতন্ত্র? হ্যাঁ. টানা? না। এক মাসের মধ্যে জমা দেওয়া পিওর গণনা করার সঠিক উপায় হ'ল ... প্রতিটি রেকর্ডে কিছু [অপরিবর্তনীয়] তারিখের ক্ষেত্রের ভিত্তিতে সেই মাসে উত্থাপিত পিওর সংখ্যা গণনা করা।
ফিল্ড ডব্লিউ।

-4

এটি এসকিউএল সার্ভারের সমস্যা। আপনি যা করতে পারেন তা কলামটি পুনরায় পুনরায় সাজানো।

ভুল কলাম আইডি সহ এন্ট্রি মুছুন। কলাম পরিচয় নিয়ে গবেষণা করেছেন। এবং তারপরে পরবর্তী এন্ট্রিটিতে এটির সঠিক আইডি রয়েছে।

নিম্নলিখিত এসকিউএল কমান্ডটি ব্যবহার করে সনাক্ত করা হয়েছে: DBCC CHECKIDENT ('YOUR_TABLE_NAME', RESEED, 9)- 9 টি সর্বশেষ সঠিক আইডি


1
"এন্ট্রি মুছুন" এর অর্থ কী?
ypercubeᵀᴹ

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