এসকিউএল সার্ভার বিদ্যমান সারণীতে স্বয়ংক্রিয় বর্ধিত প্রাথমিক কী যুক্ত করে


252

শিরোনাম হিসাবে, আমার কাছে একটি বিদ্যমান সারণী রয়েছে যা ইতিমধ্যে 150000 রেকর্ড সহ জনবহুল। আমি একটি আইডি কলাম যুক্ত করেছি (এটি বর্তমানে নাল)।

আমি ধরে নিচ্ছি যে আমি এই কলামটি ইনক্রিমেন্টাল সংখ্যা সহ পূরণ করতে, এবং তারপরে প্রাথমিক কী হিসাবে সেট করে স্বয়ংক্রিয় বৃদ্ধি চালু করতে পারি। এটি কি এগিয়ে যাওয়ার সঠিক উপায়? এবং যদি তাই হয় তবে আমি কীভাবে প্রাথমিক নম্বরগুলি পূরণ করব?

উত্তর:


428

না - আপনাকে অন্যদিকে এটি করতে হবে: এটিকে সরাসরি আসার সময় থেকে যুক্ত করুন INT IDENTITY- আপনি এটি করার সময় এটি পরিচয়ের মান দিয়ে পূর্ণ হবে:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

এবং তারপরে আপনি এটিকে প্রাথমিক কী তৈরি করতে পারেন:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

অথবা আপনি যদি এক পদক্ষেপে সমস্ত কিছু করতে পছন্দ করেন:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

2
এটি সত্যিই ভাল উত্তর, তবে আমি কীভাবে প্রারম্ভিক পূর্ণসংখ্যা 1 থেকে 1000 এ পরিবর্তন করতে পারি? আমি 1000 এ গণনা শুরু করতে চাই I আমার সন্দেহ হয় আমি ব্যবহার করতে পারি ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1তবে আমি কোনও বিশেষজ্ঞের সাথে পরীক্ষা না করে চেষ্টা করে দেখতে চাইনি :) রেফ। pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
ব্যবহারকারী 1477388

3
আমি এটি ব্যবহার করেছি এবং এটি মনে হয় কাজ করেছেalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
ব্যবহারকারীর 1477388

1
@ স্টম: আপনি যদি কিছু নির্দিষ্ট না করেন তবে বীজ = 1 এবং ইনক্রিমেন্ট = 1 ব্যবহার করা হবে - এটি যাইহোক সবচেয়ে বেশি ব্যবহৃত সেটিং setting আপনি যদি এই জাতীয় কোনও সারণী তৈরি করেন - এটি ঠিক কাজ করবে work তবে আমি আপনার এসকিউএল স্ক্রিপ্টগুলিতে সর্বদা স্পষ্টভাবে বীজ এবং বৃদ্ধি নির্দিষ্ট করার জন্য সুপারিশ করব - বিশেষত একটি বৃহত্তর সাইটের জন্য। এটা ঠিক ভাল অনুশীলন।
marc_s

1
@ স্টম: ঠিক আছে, PRIMARY KEYবোঝা যাচ্ছে যে NOT NULLস্থানে রয়েছে - তাই আবারও - এটি একেবারে প্রয়োজনীয় নয়। তবে আমি স্পষ্ট হওয়া পছন্দ করি এবং তাই আমি সবসময় NOT NULLসেখানে থাকি , একেবারে পরিষ্কার হওয়ার জন্য
মার্ক_স

3
@ টার্বো ৮৮: আপনি যখন আপনার সংজ্ঞা দেন PRIMARY KEY, তখন ক্লাস্টারড সূচকটি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয় (যদি আপনি স্পষ্টভাবে নির্দিষ্ট না করেন NONCLUSTERED)
মার্ক_স

19

আপনি পরিচয়টি "চালু" করতে পারবেন না: এটি একটি সারণী পুনর্নির্মাণ।

যদি আপনি নম্বর ক্রমের বিষয়ে চিন্তা না করেন তবে আপনি কলামটি যুক্ত করবেন, একসাথে পরিচয়ের সাথে শুল্ক নয়। 150k সারি অনেক বেশি নয়।

আপনার যদি কিছু নম্বর অর্ডার সংরক্ষণের প্রয়োজন হয়, তবে সেই অনুযায়ী সংখ্যাগুলি যুক্ত করুন। তারপরে আইডেন্টিটি সম্পত্তি সেট করতে এসএসএমএস টেবিল ডিজাইনার ব্যবহার করুন। এটি আপনাকে এমন একটি স্ক্রিপ্ট তৈরি করতে দেয় যা কলামটি আপনার জন্য ড্রপ / অ্যাড / রাখুন / পুনরায় সেট করবে।


5
ওপি এসকিউএল সার্ভার ২০০৮-তে রয়েছে তাই একটি উপায় আছে
মার্টিন স্মিথ

পুরো উদাহরণটি একক ব্যবহারকারী মোডে শুরু করা দরকার তাই বেশিরভাগ পরিস্থিতিতে সম্ভবত কার্যকর নয় তবে ALTER TABLE ... SWITCHএটি ব্যতীত এটি করতে পারে।
মার্টিন স্মিথ

11

আমার এই সমস্যাটি ছিল, তবে একটি পরিচয় কলাম ব্যবহার করতে পারিনি (বিভিন্ন কারণে)। আমি এটি স্থির করে:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

এখান থেকে ধার করা ।


4

কলামটি যদি আপনার টেবিলটিতে ইতিমধ্যে বিদ্যমান থাকে এবং এটি শূন্য হয় তবে আপনি এই কমান্ডের সাহায্যে কলামটি আপডেট করতে পারেন (আইডি, টেবিলের নাম এবং টেবিলকি প্রতিস্থাপন করুন):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

আপনি এই এক সঙ্গে আমার সময় বাঁচাতে! @ জিবিএন এর উত্তরে ভাল সংযোজন।
ক্রিসটেন ওয়েট

2

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


2

ডিজাইনার দ্বারা আপনি পরিচয় সেট করতে পারবেন (1,1) অংশে বাম দিকে টিবিএল => ডেসিং => এ ডান ক্লিক করুন (ডান ক্লিক করুন) => বৈশিষ্ট্য => পরিচয় কলামগুলিতে # কলামটি নির্বাচন করুন

প্রোপার্টি

আদর্শ কলাম


1
এটি একটি ভাল পদ্ধতির কিনা তা সম্পর্কে আপনার কি তথ্য আছে? ওপিকে জিজ্ঞাসা করা হচ্ছে এটি "এগিয়ে যাওয়ার সঠিক উপায়" কিনা। আরও সম্পূর্ণ উত্তর তাদের পদ্ধতির পক্ষে / কৌশলগুলি জানতে সহায়তা করতে পারে।
জিঙ্গলেস্টুলা

সত্যই আমি উন্নয়নের পরিবেশে এই বিকল্পটি ব্যবহার করছি, আপনি যদি এই পরিবর্তনটি উত্পাদনে পৌঁছে দিতে চান তবে পরিচয় ক্ষেত্রটি কোনও স্টোর পদ্ধতি ও ট্রিগার দ্বারা পরিচয় ক্ষেত্রটি ব্যবহার করা হচ্ছে কিনা তা আপনাকে অবশ্যই ডিপেন্ডেন্সির সাথে যাচাই করা উচিত।
গুস্তাভো হেরের

2

যদি আপনার টেবিলটির প্রাথমিক বা ফোরজিজন কী ব্যবহার করে অন্য টেবিলের সাথে সম্পর্ক থাকে তবে আপনার টেবিলটি পরিবর্তন করা অসম্ভব। সুতরাং আপনাকে আবার টেবিলটি ড্রপ করে তৈরি করতে হবে।
এই সমস্যাগুলি সমাধান করার জন্য আপনাকে স্ক্রিপ্টগুলি জেনারেট করতে হবে ডানদিকের ডাটাবেসে এবং উন্নত বিকল্পে স্ক্রিপ্ট থেকে ডেটা স্ক্রিপ্ট এবং ডেটা সেট করুন। এরপরে, এই কপিরাইটটি ব্যবহার করে টেবিলটি সনাক্ত করতে এবং পুনঃজেনার করতে আপনার কলাম পরিবর্তন করে এই স্ক্রিপ্টটি ব্যবহার করুন।
আপনার জিজ্ঞাসা এখানে হবে:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

0

এখানে আপনি চেষ্টা করতে পারেন একটি ধারণা। আসল সারণী - কোনও পরিচয় কলাম টেবিল 1 একটি নতুন টেবিল তৈরি করবে না - পরিচয় কলামের সাথে টেবিল 2 কল করুন। টেবিল 1 থেকে টেবিল 2-তে ডেটা অনুলিপি করুন - পরিচয় কলামটি স্বয়ংক্রিয় বর্ধিত সংখ্যার সাথে স্বয়ংক্রিয়ভাবে পপুলেটে।

মূল টেবিলটির নাম পরিবর্তন করুন - টেবিল 1 থেকে টেবিল 3 নতুন টেবিলটির নামকরণ করুন - টেবিল 2 টেবিল 1 (মূল টেবিল) এখন আপনার কাছে পরিচয় কলাম সহ টেবিল 1 রয়েছে এবং বিদ্যমান ডেটার জন্য পপুলেটেড রয়েছে। কোনও সমস্যা নেই তা নিশ্চিত করার পরে এবং সঠিকভাবে কাজ করার পরে, যখন আর প্রয়োজন হবে না তখন টেবিল 3 ফেলে দিন।


0

বিভিন্ন নাম এবং একই কলাম, প্রাথমিক কী এবং বিদেশী কী সমিতি সহ একটি নতুন সারণী তৈরি করুন এবং আপনার কোডের সন্নিবেশ বিবৃতিতে এটি লিঙ্ক করুন। উদাহরণস্বরূপ: EMPLOYEE এর জন্য, EMPLOYEES দিয়ে প্রতিস্থাপন করুন।

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

তবে আপনাকে হয় বিদ্যমান এমপ্লয়ই টেবিলটি মুছতে হবে বা আপনার প্রয়োজন অনুযায়ী কিছু সামঞ্জস্য করতে হবে।


0

এই উত্তরটি সর্বোচ্চ ভোট দেওয়া উত্তরের একটি সামান্য সংযোজন এবং এসকিউএল সার্ভারের জন্য কাজ করে। প্রশ্নটিতে একটি অটো ইনক্রিমেন্ট প্রাথমিক কী অনুরোধ করা হয়েছে, বর্তমান উত্তরটি প্রাথমিক কী যুক্ত করে, তবে এটি স্বয়ংক্রিয় বৃদ্ধি হিসাবে পতাকাঙ্কিত হয় না। নীচের স্ক্রিপ্টটি কলামগুলি, অস্তিত্বের জন্য পরীক্ষা করে এবং এটি স্বয়ংসোধক পতাকাটি সক্ষম করে যোগ করে।

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO

0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
তুমি কি এটা ব্যাখ্যা করতে পারবে?
মুহাম্মদ দাস ইয়াসকুর

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

-1

টেবিলের পরিবর্তন / ** ট্যাবলের নাম আটকান ** / আইডি আইএনটি পরিচয় যুক্ত করুন (1,1)

/ ** থেকে মুছে ফেলুন তাবেলের নাম ** / যেখানে আইডি ইন আটকান

(

এইড থেকে এড / সিলেক্ট করুন / ** ট্যাবলের নাম / লেফট আউটয়ার জয়েন হিসাবে নির্বাচন করুন (নির্বাচন করুন এমআইএন (আইডি) থেকে আইডি হিসাবে / ট্যাবলের নাম / গ্রুপের মাধ্যমে পেস্ট করুন / কলামগুলি সি 1, সি 2 আটকান .... ** /

) as t1 
ON a.id = t1.id

যেখানে t1.id নিখুঁত

)

টেবিলের পরিবর্তন / ** তবলীর নাম ** / ড্রপ কলম আইডি পেস্ট করুন



1
আপনার কোড উদাহরণটি সঠিকভাবে ফর্ম্যাট করতে মার্কডাউন ব্যবহার করে আপনার উত্তরটি সম্পাদনা করুন।
বিল কেলার

-3

এরকম কিছু চেষ্টা করুন (প্রথমে একটি পরীক্ষার টেবিলে):

আপনার_ড্যাটাবেস_নাম ব্যবহার করুন
যাওয়া
WHIL (আপনার নির্বাচিত তালিকা থেকে নির্বাচন করুন (*) যেখানে আপনার_আইডি_ফিল্ডটি শুভ)> 0
BEGIN
    রুট অ্যাকাউন্ট 1 সেট করুন
    আপনার_সারণযোগ্য আপনার_আইডি_ফিল্ড = MAX (আপনার_আইডি_ফিল্ড) +1 আপডেট করুন
শেষ
'সমস্ত কাজ' প্রিন্ট করুন

আমি এটি মোটেও পরীক্ষা করিনি, তাই সাবধান!


1
-1 প্রশ্নের উত্তর দেয় না (যা IDENTITYকলাম যুক্ত করার বিষয়ে ) এবং যাইহোক কাজ করবে না। UPDATE your_table SET your_id_field = MAX(your_id_field)+1আপনি MAXসেখানে চক করতে পারবেন না । WHEREএকই সারিটি বারবার আপডেট করা এড়াতে একটি ধারা কোথায় ?
মার্টিন স্মিথ

-3

এটি মারিয়াডিবিতে কাজ করে, তাই আমি কেবল এসকিউএল সার্ভারে এটির আশা করতে পারি: আপনি সবেমাত্র sertedোকানো আইডি কলামটি ফেলে দিন, তারপরে নিম্নলিখিত বাক্য গঠনটি ব্যবহার করুন: -

টেবিলের টেবিলের নাম পরিবর্তিত করুন প্রধান কী স্বতঃপরিচয়;

অন্য টেবিলের দরকার নেই। এটি কেবল একটি আইডি কলাম সন্নিবেশ করায়, এটিকে প্রাথমিক সূচি তৈরি করে এবং ক্রমবর্ধমান মান সহ এটি জনপ্রিয় করে তোলে। যদি এসকিউএল সার্ভার এটি না করে তবে আপনার সময় নষ্ট করার জন্য দুঃখিত ologies


-3

টেবিলের টেবিলের নামটি কলম আইডি যুক্ত করুন প্রাথমিক প্রাথমিক কী স্বয়ংক্রিয়িকরণ না; এটি দরকারী হতে পারে

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