মোছার পরে এসকিউএল সার্ভারে স্বতঃসংশোধন পুনরায় সেট করুন


265

আমি একটি এসকিউএল সার্ভার ডাটাবেসের একটি টেবিল থেকে কিছু রেকর্ড মুছে ফেলেছি। এখন আইডিটি 101 থেকে 1200 পর্যন্ত চলেছে I আমি আবার রেকর্ডগুলি মুছতে চাই, তবে আমি চাইছি আইডিটি আবার 102 এ ফিরে যেতে S এসকিউএল সার্ভারে এটি করার কোনও উপায় আছে কি?


46
দয়া করে "এটি করবেন না" বলবেন না। আমি কিছু ঘৃণা করি যখন আমি জিজ্ঞাসা করি এবং আমি যা পাই তা হ'ল না। হ্যাঁ পরিচয়টি পুনরায় সেট করা বৈদেশিক কী সমস্যাগুলির কারণ হতে পারে তবে কেবল যদি আপনি সেই অনুযায়ী আপনার ডাটাবেস এবং প্রোগ্রামটি না জানেন। একটি নির্ধারিত মোছার পরে একটি পরিচয় পুনরায় সেট করার জন্য খুব ভাল কারণ রয়েছে - তাদের অডিটর বলা হয়। নিরীক্ষকরা শূন্যস্থানগুলি দেখতে ঘৃণা করেন তাই এগুলি পূরণ করুন, এটি একটি নিয়ন্ত্রিত উপায়ে করুন এবং বিদেশী কী প্রতিবন্ধকতা বজায় রয়েছে কিনা তা নিশ্চিত করুন।

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

উত্তর:


454

1 টি থেকে শুরু করার জন্য পুনরায় রচনাযোগ্য মাইটিবেলে নিম্নলিখিত কমান্ডটি জারি করুন:

DBCC CHECKIDENT (mytable, RESEED, 0)

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


4
... কারণ এই রেকর্ডগুলির আইডির সুখে আবার ব্যবহার করা হবে, ফলে একটি খারাপ গোলযোগ ঘটবে।
এলোমেলোভাবে

3
প্রকৃতপক্ষে, আইডি শুরু করতে 1 শুরু করতে, আপনাকে 0 ব্যবহার করতে হবে: DBCC CHECKIDENT (mytable, RESEED, 0)
রায়ান লুন্ডি

7
"ডিবিসিসি চেককিডেন্ট (টেবিলের নাম)" আপনাকে "সাবধানতা অবলম্বন করতে হবে না" এর চেয়ে সারণীতে সর্বাধিক পরিচয় নির্ধারণ করে
ব্যবহারকারী 1027167

4
@ user1027167 না, আপনার উত্তর আমার পক্ষে কার্যকর হয়নি। এটি অভ্যন্তরীণভাবে সংরক্ষণিত সর্বোচ্চ আইডিতে বর্ধিত রাখে। পরবর্তী আইডি হিসাবে "19" পেতে আমাকে আমার ক্ষেত্রে স্পষ্টভাবে "RESEED, 18" ব্যবহার করতে হয়েছিল। এটি ছাড়া সুখে "29" তে বর্ধিত থাকে kept
ম্যাথিস কোহলি 12'16

সনাক্তকরণের মানটি কলামের সর্বাধিক মানের চেয়ে কম হলেই ডিবিসিসি চেকিডেন্ট (টেবিলের নাম) বীজ পরিবর্তন করে । সুতরাং পরিচয় মানটি যদি ইতিমধ্যে @ ম্যাথিসকোহিলি মামলার মতো বড় হয় তবে স্পষ্টতই পুনঃনির্মাণ করা উচিত।
মার্থিন

82
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

যদি সংখ্যা = 0 হয় তবে পরবর্তী সন্নিবেশে স্বয়ংক্রিয় বৃদ্ধি ক্ষেত্রের মান 1 থাকবে

যদি সংখ্যা = 101 তবে পরের সন্নিবেশে অটো বর্ধন ক্ষেত্রের মান 102 থাকবে


কিছু অতিরিক্ত তথ্য ... আপনার জন্য দরকারী হতে পারে উপরের ক্যোয়ারীতে

স্বতঃবৃদ্ধি দেওয়ার আগে number, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার বিদ্যমান টেবিলের স্বতঃবৃদ্ধি কলামে এর চেয়ে কম মান রয়েছে number

একটি সারণী (টেবিল 1) থেকে একটি কলামের (কলামের নাম) সর্বাধিক মান পেতে, আপনি নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারেন

 SELECT MAX(column_name) FROM table1

37

আধা বোকা-প্রমাণ:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete


1
"ডিবিসিসি চেকিডেন্ট (টেবিলের নাম)" একই কাজ করে (জাতি শর্ত ছাড়াই সম্ভব)
ব্যবহারকারী 1027167

2
@ user1027167 ডক্সটি বলছে 'যদি কোনও টেবিলের জন্য বর্তমান পরিচয় মান পরিচয় কলামে সঞ্চিত সর্বাধিক পরিচয়ের মানের চেয়ে কম হয়'; যা ডেটা মুছে ফেলার পরে ক্লিনআপ কভার করে না (আইডির পুনরায় ব্যবহার - প্রায়শই খারাপ ধারণা)। এসকিউএল 2008
ব্যবহারকারী 423430

1
সেরা পদ্ধতিগত এবং স্বয়ংক্রিয় উত্তর। বলিহারি!
মেহেদী খাদেমলু

11

আপনি যদি মাইএসকিউএল ব্যবহার করেন তবে এটি ব্যবহার করে দেখুন:

ALTER TABLE tablename AUTO_INCREMENT = 1

3
এটি মাইএসকিউএলের জন্য একটি উত্তর। ওপি এমএসএসকিউএল সম্পর্কে জিজ্ঞাসা করছে।
সংস্কার করা হয়েছে

প্রশ্নটি এমএস এসকিউএল সার্ভার সম্পর্কে
সাহের আহওয়াল

6

একটি ডাটাবেসে সমস্ত সারণী মুছুন এবং পুনরায় গবেষণা করুন।

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.

6

আমি এটি বের করেছিলাম। এটা:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)

4

গ্রহণযোগ্য উত্তরের ভিত্তিতে, যারা সম্পূর্ণ স্কিমা যোগ্যতার সাথে একই ধরণের সমস্যার মুখোমুখি হয়েছেন:

( [MyDataBase].[MySchemaName].[MyTable]) ... একটি ত্রুটির ফলস্বরূপ, আপনাকে সেই ডিবি প্রসঙ্গে থাকতে হবে

এটি হল, নিম্নলিখিতটি একটি ত্রুটি ফেলে দেবে:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

পরিবর্তে একক উদ্ধৃতি সহ পুরো-যোগ্যতাসম্পন্ন টেবিলের নামটি বন্ধ করুন:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)

4

বেশ কয়েকটি উত্তর একটি বিবৃতি এই জাতীয় কিছু ব্যবহার করার পরামর্শ দেয়:

DBCC CHECKIDENT (mytable, RESEED, 0)

তবে ওপি "কিছু রেকর্ড মুছে ফেলেছে" বলেছে, যা সেগুলি সবই নাও হতে পারে, সুতরাং 0 এর মান সর্বদা সঠিক হয় না। আর একটি উত্তর স্বয়ংক্রিয়ভাবে সর্বাধিক বর্তমান মান সন্ধান করার এবং সেটির পুনরায় গবেষণা করার পরামর্শ দেয়, তবে টেবিলে কোনও রেকর্ড না থাকলে এটি সমস্যার মধ্যে চলে যায় এবং সর্বাধিক () NULL ফিরিয়ে দেবে। একটি মন্তব্য সহজভাবে ব্যবহার করার পরামর্শ দেওয়া হয়েছে

DBCC CHECKIDENT (mytable)

মানটি পুনরায় সেট করতে, তবে অন্য একটি মন্তব্য সঠিকভাবে জানিয়েছে যে এটি কেবলমাত্র টেবিলে ইতিমধ্যে সর্বাধিকের তুলনায় মূল্য বৃদ্ধি করে; টেবিলের সর্বাধিকের চেয়ে ইতিমধ্যে যদি ওপরে এটি করতে চেয়েছিল তবে মানটি হ্রাস করবে না।

একটি ভাল সমাধান এই ধারণাগুলি একত্রিত করে। প্রথম CHECKIDENT মানটি 0 তে পুনরায় সেট করে, এবং দ্বিতীয়টি বর্তমানে সারণীতে সর্বাধিক মানটিতে পুনরায় সেট করে, যদি সারণীতে রেকর্ড রয়েছে:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

যেমন একাধিক মন্তব্য ইঙ্গিত করেছে, মুছে ফেলা রেকর্ডগুলির দিকে ইশারা করে অন্য টেবিলগুলিতে কোনও বিদেশী কী নেই তা নিশ্চিত করুন। অন্যথায় এই বিদেশী কীগুলি আপনি সারণীটি পুনর্বিবেচনা করার পরে তৈরি করা রেকর্ডগুলিকে নির্দেশ করবে, যা আপনার মনের মনে প্রায় ছিল না।


4

আমি এই উত্তরটি যুক্ত করতে চাই কারণ DBCC CHECKIDENTযখন আপনি টেবিলগুলির জন্য স্কিমা ব্যবহার করেন তখন -প্রয়োগটি সমস্যার সম্মুখীন হবে। নিশ্চিত হতে এটি ব্যবহার করুন:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

আপনি যদি অপারেশনটির সাফল্য পরীক্ষা করতে চান তবে ব্যবহার করুন

SELECT IDENT_CURRENT(@Table);

যা 0উপরের উদাহরণে আউটপুট করা উচিত ।


1

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


6
আমি এটি সব সময় ব্যবহার করব না এবং এটি কেবল একটি পরীক্ষার ডিবিতে ছিল।
জাম্বুজ

0

এই সম্পর্কে কি?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

এটি স্বয়ংক্রিয় বৃদ্ধি 0 বা যে কোনও সংখ্যায় যা চান তাতে পরিবর্তন করার জন্য একটি দ্রুত এবং সহজ উপায়। আমি এটি একটি ডেটাবেস রফতানি করে এবং কোডটি নিজে পড়ে দেখেছি।

এটিকে একটি একক-লাইন সমাধান তৈরি করতে আপনি এটি এ জাতীয়ভাবে লিখতে পারেন:

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

1
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
বিদায় স্ট্যাক এক্সচেঞ্জ 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.