কীভাবে প্রোগ্রামিমে পরিচয় কলাম মান পরিবর্তন করবেন?


160

আমার Testকলাম সহ একটি টেবিল সহ এমএস এসকিউএল 2005 ডাটাবেস রয়েছে IDIDএকটি পরিচয় কলাম।

আমার এই টেবিলটিতে সারি রয়েছে এবং তাদের সকলেরই সম্পর্কিত আইডি অটো বর্ধিত মান রয়েছে।

এখন আমি এই টেবিলের প্রতিটি আইডি এভাবে পরিবর্তন করতে চাই:

ID = ID + 1

তবে আমি যখন এটি করি তখন আমি একটি ত্রুটি পাই:

পরিচয় কলাম 'আইডি' আপডেট করতে পারে না।

আমি এটি চেষ্টা করেছি:

    ALTER TABLE Test NOCHECK CONSTRAINT ALL 
    set identity_insert ID ON

তবে এটি সমস্যার সমাধান করে না।

এই কলামটিতে আমার পরিচয় সেট করা দরকার, তবে সময়ে সময়ে আমার মানগুলিও বদলাতে হবে। সুতরাং আমার প্রশ্নটি এই কাজটি কীভাবে সম্পাদন করা যায়।

উত্তর:


220

তোমার দরকার

set identity_insert YourTable ON

তারপরে আপনার সারিটি মুছুন এবং এটিকে আলাদা পরিচয় দিয়ে আবার সন্নিবেশ করুন।

একবার আপনি সন্নিবেশটি সম্পন্ন করার পরে পরিচয়_ইনসেটটি বন্ধ করতে ভুলবেন না

set identity_insert YourTable OFF

133
এই সেট করাটি কেবলমাত্র ডেটা whenোকানোর সময় এবং আপডেট করার সময় নয় work আপডেট আপডেটটি এখনও ব্যর্থ হবে।
হুসেইন রোনসভিক

31
একটি আপডেটের জন্য, আপনাকে মুছতে হবে এবং পুনরায় সন্নিবেশ করতে হবে। অন্য কোন উপায় নেই।
ashes999

1
@ মার্টিনস্মিত আপনার সমাধান খুব দীর্ঘ বলে মনে হচ্ছে। এটি দুটি ধাপে করতে সক্ষম হওয়া (পরিচয়-বন্ধ, মোছা / সন্নিবেশ করানো, পরিচয় অন) আরও কার্যকর।
ashes999

3
@ ashes999 এটি 4 টি ধাপ নয় 2। আমার উত্তরটি আরও একটি মাত্র (টেবিল তৈরি করুন, স্যুইচ করুন, আপডেট করুন, ফিরে স্যুইচ করুন, ড্রপ করুন) সম্ভবতঃ আপনি এই পদক্ষেপগুলির সাথে আরও বেশি পরিচিত তাই তারা কম সংশ্লেষিত দেখায়। আপডেট করা অনেক বেশি কার্যকর হতে পারে তারপরে অনেকগুলি সারি জড়িত থাকাকালীন সন্নিবেশ মুছুন। এছাড়াও আপনি মুছে ফেলা সারিটি কোথায় রাখছেন? যদি #tempআপনি যে টেবিলটি পরে রেখে দেন তা যদি অন্য পদক্ষেপ হয় তবে আপনি এখানে গণনা করেন নি।
মার্টিন স্মিথ

40

IDENTITY কলাম মানগুলি পরিবর্তনযোগ্য।

তবে IDENTITYসম্পত্তি মুছে ফেলার জন্য টেবিল মেটাডেটা স্যুইচ করা সম্ভব , আপডেটটি করা, তারপরে ফিরে যেতে।

নিম্নলিখিত কাঠামো ধরে নেওয়া

CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test 
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

তাহলে আপনি করতে পারেন

/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)

/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;

/*Do the update*/
UPDATE Temp SET ID = ID + 1;

/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;

/*ID values have been updated*/
SELECT *
FROM Test

/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
    DROP TABLE Temp /*Drop obsolete table*/

এসকিউএল সার্ভার ২০১২-এ একটি অটো ইনক্রিমেন্টিং কলাম থাকা সম্ভব যেগুলি আরও সহজবোধ্যভাবে আপডেট করা যেতে পারে SEQUENCES

CREATE SEQUENCE Seq
    AS INT
    START WITH 1
    INCREMENT BY 1

CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

UPDATE Test2 SET ID+=1

1
খুব চতুর। প্রতিদিন নতুন কিছু শিখুন (বিটিডাব্লু আমি এসকিএলএক্সপ্রেসে এটি পরীক্ষা করেছিলাম; সুইচ সত্ত্বেও এটি বিভাজন ব্যবহার করে না, স্পষ্টতই)) নোট করুন যে টেবিলটি বেশ কিছুটা হুবহু মিলবে (সূচিপত্র, এফকে, ইত্যাদি)
মার্ক সোউল

1
আপনার যখন মূল টেবিলের উপরে পিকে, এফকে, সূচক এবং ভিউগুলি নির্মিত তখন কি স্যুইচ পদ্ধতিটি কাজ করে? তারা কি এই পদ্ধতিটি ব্যবহার করে ভেঙে দেবে?
tj

1
@tj সমস্ত সূচিপত্র এবং সীমাবদ্ধতা সহ উত্স টেবিলের বাইরে টেম্প টেবিল স্ক্রিপ্ট তৈরি করার সময়। তারপরে টেবিলের নাম পরিবর্তন করুন এবং সংঘর্ষ এড়াতে বাধা। সূচিযুক্ত বা স্কিমাবাউন্ড না করা হলে ভিউগুলি কোনও সমস্যার কারণ হতে পারে না।
মার্টিন স্মিথ

টেবিলে একটি পূর্ণ-পাঠ্য অনুসন্ধান সূচক থাকলে কাজ করে না। আমি মনে করি এটি মুছে ফেলা এবং পরে এটি পুনরায় তৈরি করা সম্ভব, কিন্তু আমি পরীক্ষা করিনি।
ইউএন

26

এসকিউএল সার্ভার 2005 ম্যানেজারের ইউআইয়ের মাধ্যমে কলামটি কলামের স্বায়ত্তশাসন (পরিচয়) সম্পত্তি মুছে ফেলুন (ডানদিকে ক্লিক করে টেবিলটি নির্বাচন করুন এবং "নকশা" নির্বাচন করুন)।

তারপরে আপনার ক্যোয়ারী চালান:

UPDATE table SET Id = Id + 1

তারপরে যান এবং কলামটিতে স্বায়ত্তশাসন সম্পত্তি যুক্ত করুন।


3
আপনি যদি ম্যানুয়ালি পরিবর্তনটি করেন, আপনি ম্যানেজারকে পরিবর্তনের জন্য এসকিউএল স্ক্রিপ্ট তৈরি করতে বলতে পারেন (টেবিল ডিজাইনার মেনু, পরিবর্তন স্ক্রিপ্ট উত্পন্ন)। এই পরিবর্তনের জন্য এটি একটি নতুন টেবিল তৈরি করে এবং ডেটা জুড়ে অনুলিপি করে, তারপরে মূলটি মুছে দেয়।
রবিন বেনেট

2
@ টমজস - একটি কোড উদাহরণ যা আরও কার্যকর যেহেতু এটি শারীরিকভাবে টেবিলটি একেবারে পুনর্নির্মাণ না করে (এটি দুইবার এটি করবে) আমার দেরীতে উত্তরটি এখানে রয়েছে
মার্টিন স্মিথ

আপনি পরিচয়টি আর যোগ করতে পারবেন না। আপনি কি? stackoverflow.com/questions/1049210/…
টমাস কুবেস

ধন্যবাদ। এটি নিখুঁত ছিল। আমার টেবিলে আমার 1 টি সারি ছিল যা আমি অবগত ছিলাম না, সুতরাং আমার টেবিলের জন্য আমার বুটস্ট্র্যাপ স্ক্রিপ্টগুলিতে Idঅটো আইডেন্টিটি মান 1 দিয়ে বন্ধ হয়ে গেছে
শিব

18

প্রথমত সেই বিষয়ে আইডিএনটিআইটিএসইআরটিটি চালু করা বা বন্ধ করা আপনার প্রয়োজনীয় কাজের জন্য কার্যকর হবে না (এটি নতুন মান সন্নিবেশ করানোর জন্য ব্যবহৃত হয়, যেমন প্লাগিং ফাঁকগুলি)।

জিইউআইয়ের মাধ্যমে অপারেশন করা কেবল একটি অস্থায়ী টেবিল তৈরি করে, সমস্ত তথ্য একটি পরিচয় ক্ষেত্র ছাড়াই একটি নতুন টেবিলের অনুলিপি করে এবং টেবিলটির নাম পরিবর্তন করে।


9

এটি একটি অস্থায়ী টেবিল ব্যবহার করে করা যেতে পারে।

বুদ্ধিটা

  • সীমাবদ্ধতাগুলি অক্ষম করুন (যদি আপনার আইডি বিদেশী কী দ্বারা উল্লেখ করা হয়)
  • নতুন আইডি দিয়ে একটি টেম্প টেবিল তৈরি করুন
  • টেবিলের সামগ্রী মুছুন
  • অনুলিপি করা টেবিল থেকে আপনার মূল টেবিল থেকে তথ্য অনুলিপি
  • প্রচলিত অক্ষম প্রতিবন্ধকতা সক্ষম করুন

এসকিউএল কোয়েরি

আসুন বলে আপনার testটেবিল দুটি অতিরিক্ত কলাম (আছে column2এবং column3) এবং সেখানে বিদেশী কী 2 টেবিল উল্লেখ আছে testবলা foreign_table1এবং foreign_table2(কারণ বাস্তব জীবনে সমস্যা সহজ হয় না)।

alter table test nocheck constraint all;
alter table foreign_table1 nocheck constraint all;
alter table foreign_table2 nocheck constraint all;
set identity_insert test on;

select id + 1 as id, column2, column3 into test_copy from test v;
delete from test;
insert into test(id, column2, column3)
select id, column2, column3 from test_copy

alter table test check constraint all;
alter table foreign_table1 check constraint all;
alter table foreign_table2 check constraint all;
set identity_insert test off;
drop table test_copy;

এটাই.


6

ডিবিসিসি চেকিডেন্ট ('ডাটাবেসনাম.ডবো.অর্ডারস', রিসিড, ৯৯৯) আপনি এই কমান্ডের সাহায্যে কোনও পরিচয় কলাম নম্বর পরিবর্তন করতে পারবেন এবং আপনি যে নম্বরটি চান তা থেকে এই ক্ষেত্র নম্বরটি শুরু করতে পারেন for উদাহরণস্বরূপ আমার কমান্ডে আমি শুরু করতে বলি 1000 (999 + 1) আশা করি এটি যথেষ্ট হবে ... সৌভাগ্য


4

যদি কলামটি পিকে না হয় আপনি বর্ধিত সংখ্যা সহ সর্বদা সারণীতে একটি নতুন কলাম তৈরি করতে পারেন, আসলটি ড্রপ করুন এবং তারপরে নতুনটিকে পুরানো হিসাবে পরিবর্তন করতে পারবেন।

আপনার কেন এটি করার প্রয়োজন হতে পারে এ সম্পর্কে কৌতূহল ... বেশিরভাগ ক্ষেত্রে আমাকে আইডেন্টিটি কলামগুলির সাথে ফুট করতে হয়েছিল নাম্বার ব্যাকফিল করা এবং আমি সবেমাত্র ডিবিসিসি চেকিডেন্ট (টেবিলের নাম, রিসিড, নিউনেক্সটम्बर) ব্যবহার করে শেষ করেছি

শুভকামনা!


1

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

শুভকামনা

পিএস এটি ব্যর্থ হচ্ছে না কারণ এটি চলছে এমন ক্রমিক ক্রমটি তালিকার একটি মানটিকে আইডেমের তালিকায় ইতিমধ্যে বিদ্যমান একটি আইটেমে আপডেট করার চেষ্টা করছে? খড়ের উপর আটকে থাকা, সম্ভবত সারিগুলির সংখ্যা +1 যোগ করুন, তারপরে যদি এটি কাজ করে তবে সারিগুলির সংখ্যা বিয়োগ করুন: -এস


1

আপনার যদি মাঝে মাঝে আইডি পরিবর্তন করতে হয় তবে কোনও পরিচয় কলাম ব্যবহার না করাই ভাল। অতীতে আমরা স্বতঃসংযোগ ক্ষেত্রগুলি ম্যানুয়ালি একটি 'কাউন্টার' সারণী ব্যবহার করে প্রয়োগ করেছি যা প্রতিটি সারণির জন্য পরবর্তী আইডি ট্র্যাক করে। আইআইআরসি আমরা এটি করেছি কারণ পরিচয় কলামগুলি এসকিউএল 2000 এ ডাটাবেসের দুর্নীতির কারণ ঘটেছে তবে আইডি পরিবর্তন করতে সক্ষম হচ্ছিল পরীক্ষার জন্য মাঝে মাঝে দরকারী ছিল।


1

আপনি পরিবর্তিত মান সহ নতুন সারি সন্নিবেশ করতে পারেন এবং তারপরে পুরানো সারিগুলি মুছতে পারেন। নিম্নলিখিত আইডি পরিবর্তন বিদেশী কী পার্সোনআইড হিসাবে একই

SET IDENTITY_INSERT [PersonApiLogin] ON

INSERT INTO [PersonApiLogin](
       [Id]
      ,[PersonId]
      ,[ApiId]
      ,[Hash]
      ,[Password]
      ,[SoftwareKey]
      ,[LoggedIn]
      ,[LastAccess])
SELECT [PersonId]
      ,[PersonId]
      ,[ApiId]
      ,[Hash]
      ,[Password]
      ,[SoftwareKey]
      ,[LoggedIn]
      ,[LastAccess]
FROM [db304].[dbo].[PersonApiLogin]
GO

DELETE FROM [PersonApiLogin]
WHERE [PersonId] <> ID
GO
SET IDENTITY_INSERT [PersonApiLogin] OFF
GO

1

প্রথমে সমস্ত আইডি সংরক্ষণ করুন এবং আপনি যে মানগুলি চান না সেগুলিতে প্রোগ্রামিকভাবে তাদের পরিবর্তন করুন, তারপরে তাদের ডাটাবেস থেকে সরান এবং তারপরে আবার অনুরূপ কিছু ব্যবহার করে এগুলি sertোকান:

use [Name.Database]
go
set identity_insert [Test] ON
insert into [dbo].[Test]
           ([Id])
     VALUES
           (2)
set identity_insert [Test] OFF

বাল্ক সন্নিবেশ ব্যবহারের জন্য:

use [Name.Database]
go
set identity_insert [Test] ON
BULK INSERT [Test]
FROM 'C:\Users\Oscar\file.csv'
WITH (FIELDTERMINATOR = ';',
      ROWTERMINATOR = '\n',
      KEEPIDENTITY)
set identity_insert [Test] OFF

File.csv থেকে প্রাপ্ত নমুনা ডেটা:

2;
3;
4;
5;
6;

আপনি যদি identity_insertঅফ না করে থাকেন তবে নীচের ত্রুটিটি পাবেন:

'টেস্ট' টেবিলে পরিচয় কলামের জন্য সুস্পষ্ট মান সন্নিবেশ করতে পারে না যখন আইডিএনটিটিআইপিএসআরটি বন্ধ রাখে।


0

আমি একটি ভাল নিবন্ধ দেখেছি যা আমাকে শেষ মুহুর্তে সাহায্য করেছিল .. আমি একটি টেবিলে কয়েকটি সারি সন্নিবেশ করানোর চেষ্টা করছিলাম যার পরিচয় কলাম ছিল তবে এটি ভুলভাবে হয়েছিল এবং ফিরে মুছতে হবে। একবার আমি সারিগুলি মুছে ফেললে আমার পরিচয় কলাম পরিবর্তন হয়ে যায় got আমি theোকানো কলামটি আপডেট করার জন্য একটি উপায় সন্ধান করার চেষ্টা করছিলাম তবে - ভাগ্য নেই। সুতরাং, গুগলে অনুসন্ধান করার সময় একটি লিঙ্ক পাওয়া গেল ..

  1. মুছে ফেলা কলামগুলি যা ভুলভাবে .োকানো হয়েছিল
  2. চালু / বন্ধ পরিচয় ব্যবহার করে ফোর্স sertোকান

http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- ই-আপডেট-মান অফ an.aspx


1
যদিও আপনি সত্যই এখানে প্রশ্নের উত্তর দিয়েছেন তা নিশ্চিত নন।
অ্যান্ড্রু বারবার

0

অত্যন্ত চমৎকার প্রশ্ন, প্রথম আমাদের প্রয়োজন উপর নির্দিষ্ট টেবিল জন্য IDENTITY_INSERT, যে সন্নিবেশ কোয়েরি চালানো পরে (কলামের নামের নির্দিষ্ট করতে হবে)।

নোট: সম্পাদন করা পর পরিচয় কলাম, করতে ভুলবেন না বন্ধ IDENTITY_INSERT। আপনি যদি না করেন, আপনি অন্য কোনও টেবিলের জন্য পরিচয় কলাম সম্পাদনা করতে পারবেন না।

SET IDENTITY_INSERT Emp_tb_gb_Menu ON
     INSERT Emp_tb_gb_Menu(MenuID) VALUES (68)
SET IDENTITY_INSERT Emp_tb_gb_Menu OFF

http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html

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