আমি আপনার প্রশ্নটি যেভাবে বুঝতে পারি তা হ'ল আপনার কাছে একটি কলাম সহ একটি বিদ্যমান টেবিল রয়েছে যা এখন অবধি ম্যানুয়াল মানগুলি দ্বারা জনবসতিপূর্ণ এবং এখন আপনি (1) এই কলামটি একটি IDENTITY
কলাম তৈরি করতে চান এবং (2) নিশ্চিত হয়েছেন যে IDENTITY
শুরুগুলি বিদ্যমান সারিগুলির মধ্যে অতি সাম্প্রতিক মান থেকে।
প্রথমে, কিছু টেস্ট ডেটা এতে খেলতে হবে:
CREATE TABLE dbo.ident_test (
id int NOT NULL,
xyz varchar(10) NOT NULL,
CONSTRAINT PK_ident_test PRIMARY KEY CLUSTERED (id)
);
INSERT INTO dbo.ident_test (id, xyz)
VALUES (1, 'test'),
(2, 'test'),
(5, 'test'),
(6, 'test'),
(10, 'test'),
(18, 'test'),
(19, 'test'),
(20, 'test');
লক্ষ্যটি হল সারণীর প্রাথমিক কী কলামটি করা id
, একটি IDENTITY
কলাম যা পরবর্তী রেকর্ডটি .োকানো হবে তার 21 এ শুরু হবে। এই উদাহরণস্বরূপ, কলামটি xyz
টেবিলের অন্যান্য কলামগুলির সমস্ত উপস্থাপন করে।
আপনি কিছু করার আগে দয়া করে এই পোস্টের নীচে সতর্কতাগুলি পড়ুন।
প্রথমে, যদি কিছু ভুল হয়ে যায়:
BEGIN TRANSACTION;
এখন, আসুন একটি অস্থায়ী কাজের কলাম id_temp
এবং যুক্ত কলামটি বিদ্যমান id
কলামের মানগুলিতে সেট করুন:
ALTER TABLE dbo.ident_test ADD id_temp int NULL;
UPDATE dbo.ident_test SET id_temp=id;
এর পরে, আমাদের বিদ্যমান id
কলামটি ফেলে দিতে হবে (আপনি IDENTITY
একটি বিদ্যমান কলামে কেবল "যুক্ত" করতে পারবেন না , আপনাকে কলামটি একটি হিসাবে তৈরি করতে হবে IDENTITY
)। প্রাথমিক কীটিও যেতে হবে, কারণ কলামটি তার উপর নির্ভর করে।
ALTER TABLE dbo.ident_test DROP CONSTRAINT PK_ident_test;
ALTER TABLE dbo.ident_test DROP COLUMN id;
... এবং কলামটি আবার যুক্ত করুন, IDENTITY
মূল কী সহ:
ALTER TABLE dbo.ident_test ADD id int IDENTITY(1, 1) NOT NULL;
ALTER TABLE dbo.ident_test ADD CONSTRAINT PK_ident_test PRIMARY KEY CLUSTERED (id);
আকর্ষণীয় হয়ে উঠেছে এখানে এখানে। আপনি IDENTITY_INSERT
টেবিলটিতে সক্ষম করতে পারবেন , যার অর্থ আপনি IDENTITY
যখন নতুন সারি সন্নিবেশ করছেন তখন আপনি কলামের মানগুলি ম্যানুয়ালি সংজ্ঞায়িত করতে পারেন (যদিও বিদ্যমান সারিগুলি আপডেট না করে)।
SET IDENTITY_INSERT dbo.ident_test ON;
এই সেটটি দিয়ে, DELETE
সারণির সমস্ত সারি, তবে যে সারিগুলি আপনি মুছে ফেলছেন তা হ'ল OUTPUT
একই টেবিলে - তবে id
কলামের জন্য নির্দিষ্ট মান সহ (ব্যাকআপ কলাম থেকে)।
DELETE FROM dbo.ident_test
OUTPUT deleted.id_temp AS id, deleted.xyz
INTO dbo.ident_test (id, xyz);
একবার হয়ে গেলে IDENTITY_INSERT
আবার ফিরে যান।
SET IDENTITY_INSERT dbo.ident_test OFF;
আমরা যে অস্থায়ী কলামটি যুক্ত করেছি তা ফেলে দিন:
ALTER TABLE dbo.ident_test DROP COLUMN id_temp;
এবং অবশেষে, IDENTITY
কলামটি id
পুনরায় পুনরায় সাজানো হয়েছে , সুতরাং পরবর্তী রেকর্ডটি id
কলামে সর্বাধিক বিদ্যমান সংখ্যার পরে আবার শুরু হবে :
DECLARE @maxid int;
SELECT @maxid=MAX(id) FROM dbo.ident_test;
DBCC CHECKIDENT ("dbo.ident_test", RESEED, @maxid)
উদাহরণ সারণীটি পরীক্ষা করা হচ্ছে, সর্বোচ্চ id
সংখ্যা 20।
SELECT * FROM dbo.ident_test;
অন্য সারি যুক্ত করুন এবং এটির নতুন পরীক্ষা করুন IDENTITY
:
INSERT INTO dbo.ident_test (xyz) VALUES ('New row');
SELECT * FROM dbo.ident_test;
উদাহরণস্বরূপ, নতুন সারিটি থাকবে id=21
। অবশেষে, আপনি যদি খুশি হন তবে লেনদেন করুন:
COMMIT TRANSACTION;
গুরুত্বপূর্ণ
এটি একটি তুচ্ছ অপারেশন নয় এবং এটি বেশ কয়েকটি ঝুঁকি বহন করে যা সম্পর্কে আপনার সচেতন হওয়া উচিত।
নিবেদিত পরীক্ষার পরিবেশে এটি করুন। ব্যাকআপ আছে। :)
আমি BEGIN/COMMIT TRANSACTION
এটি ব্যবহার করতে পছন্দ করি কারণ এটি পরিবর্তন করার মাঝামাঝি সময়ে আপনি অন্য টেবিলের সাথে বিশৃঙ্খলা থেকে বাধা দেয় এবং এটি কিছু ভুল হয়ে গেলে সমস্ত কিছু ফিরিয়ে দেওয়ার সম্ভাবনা দেয়। তবে, আপনার লেনদেনের প্রতিশ্রুতি দেওয়ার আগে আপনার টেবিলে অ্যাক্সেস করার চেষ্টা করা অন্য যে কোনও প্রক্রিয়া অপেক্ষা করে শেষ হবে। আপনার কাছে একটি বড় টেবিল থাকে এবং / অথবা আপনি উত্পাদন পরিবেশে থাকলে এটি বেশ খারাপ হতে পারে।
OUTPUT .. INTO
আপনার টার্গেট টেবিলটিতে বৈদেশিক কী বাধা বা এমন অনেকগুলি বৈশিষ্ট্য রয়েছে যা আমি আমার মাথার উপরের অংশটি মনে করতে পারি না work পরিবর্তে আপনি অস্থায়ী টেবিলের মধ্যে ডেটা অফ-লোড করতে পারেন এবং তারপরে এটি আবার মূল টেবিলের মধ্যে .োকাতে পারেন। আপনি পার্টিশন স্যুইচিং (আপনি পার্টিশন ব্যবহার না করেও) ব্যবহার করতে সক্ষম হতে পারেন।
এই বিবৃতিগুলি এক এক হিসাবে চালান, ব্যাচ হিসাবে বা সঞ্চিত পদ্ধতিতে নয়।
আপনি যে id
কলামটি বাদ দিচ্ছেন এবং পুনরায় তৈরি করছেন তার উপর নির্ভর করতে পারে এমন অন্যান্য বিষয়গুলি চিন্তা করার চেষ্টা করুন । যে কোনও সূচকগুলি ফেলে দিতে হবে এবং পুনরায় তৈরি করতে হবে (যেমন আমরা প্রাথমিক কী দিয়েছিলাম)। প্রতিটি সূচি এবং সীমাবদ্ধতার স্ক্রিপ্ট মনে রাখবেন যা আপনাকে আগেই পুনরায় তৈরি করতে হবে।
কোন অক্ষম INSERT
এবং DELETE
টেবিলের উপর ট্রিগার।
যদি টেবিলটি পুনরায় তৈরি করা একটি বিকল্প হয়:
যদি টেবিলটি পুনরায় তৈরি করা আপনার পক্ষে একটি বিকল্প হয় তবে সবকিছুই অনেক সহজ:
- খালি টেবিলটি তৈরি করুন,
id
কলামটি একটি হিসাবে IDENTITY
,
IDENTITY_INSERT ON
টেবিলের জন্য সেট করুন ,
- টেবিলটি বসান,
- সেট করুন
IDENTITY_INSERT OFF
, এবং
- পরিচয় নিয়ে গবেষণা করেছেন।
IDENTITY
?