SQL सर्वर मौजूदा तालिका में ऑटो वेतन वृद्धि प्राथमिक कुंजी जोड़ते हैं


253

शीर्षक के रूप में, मेरे पास एक मौजूदा तालिका है जो पहले से ही 150000 रिकॉर्ड के साथ आबाद है। मैंने एक आईडी कॉलम जोड़ा है (जो वर्तमान में शून्य है)।

मैं मान रहा हूं कि मैं इस कॉलम को वृद्धिशील संख्याओं से भरने के लिए एक क्वेरी चला सकता हूं, और फिर प्राथमिक कुंजी के रूप में सेट कर सकता हूं और ऑटो वेतन वृद्धि चालू कर सकता हूं। क्या यह आगे बढ़ने का सही तरीका है? और यदि हां, तो मैं प्रारंभिक संख्या कैसे भरूं?

जवाबों:


429

नहीं - आपको इसे अन्य तरीके से करना होगा: इसे ठीक से जोड़ दें जैसे कि जाओ 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 पर गिनती शुरू करना चाहूंगा। मुझे संदेह है कि मैं उपयोग कर सकता ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1हूं, लेकिन मैं एक विशेषज्ञ के साथ जांच किए बिना इसे आज़माना नहीं चाहता था :) Ref। pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
मैंने अभी इसका इस्तेमाल किया है और ऐसा लगता है कि काम किया हैalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388

1
@stom: यदि आप कुछ भी निर्दिष्ट नहीं करते हैं, तो बीज = 1 और वृद्धि = 1 का उपयोग किया जाएगा - जो वैसे भी सबसे अधिक बार उपयोग की जाने वाली सेटिंग है। यदि आपने इस तरह एक तालिका बनाई है - यह ठीक काम करेगा। लेकिन मैं आपकी SQL लिपियों में बीज और वृद्धि को हमेशा स्पष्ट रूप से निर्दिष्ट करने की सलाह दूंगा - विशेष रूप से एक बड़ी साइट के लिए। यह सिर्फ अच्छा अभ्यास है।
marc_s

1
@stom: ठीक है, PRIMARY KEYतात्पर्य है कि NOT NULLजगह में है - तो फिर - यह बिल्कुल आवश्यक नहीं है। लेकिन मैं स्पष्ट होना पसंद करता हूं और इसलिए मेरे पास हमेशा है NOT NULL, बस बिल्कुल स्पष्ट होने के लिए
marc_s

3
@ टर्बो: जब आप अपने को परिभाषित करते हैं PRIMARY KEY, तो क्लस्टर इंडेक्स स्वचालित रूप से आपके लिए बनाया जाता है (जब तक कि आप स्पष्ट रूप से निर्दिष्ट नहीं करते हैं NONCLUSTERED)
marc_s

19

आप पहचान को "चालू" नहीं कर सकते: यह एक टेबल पुनर्निर्माण है।

यदि आपको संख्या क्रम की परवाह नहीं है, तो आप एक बार में पहचान के साथ कॉलम, नॉट NULL जोड़ सकते हैं। 150k पंक्तियाँ बहुत नहीं है।

यदि आपको कुछ संख्या क्रम को संरक्षित करने की आवश्यकता है, तो संख्याओं को तदनुसार जोड़ें। फिर IDMSITY गुण सेट करने के लिए SSMS टेबल डिज़ाइनर का उपयोग करें। यह आपको एक स्क्रिप्ट उत्पन्न करने की अनुमति देता है, जो आपके लिए कॉलम ड्रॉप / ऐड / नंबर्स / रेजिडेंट करेगा।



पूरे उदाहरण को एकल उपयोगकर्ता मोड में शुरू करने की आवश्यकता है ताकि संभवतः अधिकांश परिस्थितियों के लिए व्यवहार्य न हो लेकिन 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

आपने मुझे इस एक के साथ समय बचाया! @ Gbn के उत्तर के लिए अच्छा परिशिष्ट।
क्रिस्टन वाइट

2

जब हम मौजूदा तालिका में स्तंभ जोड़ते हैं और पहचानते हैं तो यह स्वचालित रूप से इसे मैन्युअल रूप से पॉप्युलेट करने की आवश्यकता नहीं होगी।


2

डिज़ाइनर द्वारा आप पहचान सेट कर सकते हैं (1,1) राइट क्लिक tbl => desing => भाग में बाएं (दायाँ क्लिक) => गुण => पहचान कॉलम में # रंग चुनें

गुण

आलस्य स्तंभ


1
क्या आपको इस बारे में जानकारी है कि क्या यह एक अच्छा तरीका है? ओपी पूछ रहा है कि क्या यह "आगे बढ़ने का सही तरीका" है। एक अधिक संपूर्ण उत्तर उन्हें दृष्टिकोण के पेशेवरों / विपक्षों को जानने में मदद कर सकता है।
जिंगलेथुला

वास्तव में मैं विकास के माहौल में इस विकल्प का उपयोग कर रहा हूं, यदि आप उत्पादन में इस बदलाव को पास नहीं करते हैं, तो आपको पहचान की प्रक्रिया के साथ सत्यापन करना चाहिए, यदि पहचान क्षेत्र का उपयोग कुछ स्टोर प्रक्रिया ओ ट्रिगर द्वारा किया जा रहा है।
गुस्तावो हेरेरा

2

यदि आपकी तालिका में अपनी प्राथमिक या foriegen कुंजी का उपयोग करके अन्य तालिकाओं के साथ संबंध है, तो हो सकता है कि आपकी तालिका को बदलना असंभव हो। तो आपको टेबल को फिर से गिराने और बनाने की आवश्यकता है।
इन समस्याओं को हल करने के लिए आपको डेटाबेस पर राइट क्लिक करके स्क्रिप्‍ट जनरेट करने की आवश्‍यकता है और एडवांस ऑप्‍शन में सेट टू टाइप टू डेटा टू स्‍कीम टू स्‍कीम एंड डेटा। उसके बाद, अपने क्वेरी को चलाने के लिए तालिका को पहचानने और पुनर्जीवित करने के लिए अपने कॉलम को बदलने के साथ इस स्क्रिप्ट का उपयोग करना।
आपकी क्वेरी यहां दी जाएगी:

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)   
) 

हालाँकि, आपको या तो मौजूदा EMPLOYEE टेबल को हटाना होगा या अपनी आवश्यकता के अनुसार कुछ समायोजन करना होगा।


0

यह जवाब उच्चतम मतदान जवाब और SQL सर्वर के लिए काम करने के लिए एक छोटा सा अतिरिक्त है। प्रश्न में एक ऑटो वेतन वृद्धि प्राथमिक कुंजी का अनुरोध किया गया था, वर्तमान उत्तर प्राथमिक कुंजी को जोड़ता है, लेकिन इसे ऑटो-वेतन वृद्धि के रूप में चिह्नित नहीं किया गया है। नीचे दी गई स्क्रिप्ट कॉलम, अस्तित्व की जांच करती है, और इसे स्वनिर्धारित ध्वज सक्षम करने के साथ जोड़ती है।

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
हालांकि यह कोड ओपी के मुद्दे को हल कर सकता है, लेकिन स्पष्टीकरण को शामिल करना सबसे अच्छा है कि आपका कोड ओपी के मुद्दे को कैसे संबोधित करता है। इस तरह, भविष्य के आगंतुक आपके पोस्ट से सीख सकते हैं, और इसे अपने स्वयं के कोड पर लागू कर सकते हैं। SO एक कोडिंग सेवा नहीं है, बल्कि ज्ञान के लिए एक संसाधन है। इसके अलावा, उच्च गुणवत्ता, पूर्ण उत्तरों के उत्थान होने की अधिक संभावना है। ये विशेषताएं, इस आवश्यकता के साथ कि सभी पद स्व-सम्‍मिलित हैं, एसओ की कुछ ताकतें एक मंच के रूप में हैं, जो इसे मंचों से अलग करती हैं। आप अतिरिक्त जानकारी जोड़ने और / या स्रोत प्रलेखन के साथ अपने स्पष्टीकरण के पूरक के लिए संपादित कर सकते हैं।
ysf

-1

परिवर्तन तालिका / ** सारणी का नाम पेस्ट करें ** / आईडी आईडी पहचान जोड़ें (1,1)

से हटाएं / ** टैबल का नाम पेस्ट करें ** / जहां आईडी इन है

(

a .id FROM का चयन करें / ** टैब के नाम को पेस्ट करें / एक बाईं ओर के रूप में (SELECT MIN (आईडी) के रूप में आईडी FROM से) / टैब के नाम / ग्रुप को चिपकाएँ / कॉलम c1, c2 को चिपकाएँ .... ** /

) as t1 
ON a.id = t1.id

कहाँ t1.id है नल

)

परिवर्तन तालिका / ** टैबल का नाम ** / DROP COLUMN आईडी पेस्ट करें


आपका सवाल क्या हैं? कैसे पूछें
एन किलजर

1
अपने कोड उदाहरण को ठीक से प्रारूपित करने के लिए मार्कडाउन का उपयोग करके अपने उत्तर को संपादित करें।
बिल केलर

-3

कुछ इस तरह की कोशिश करो (पहले एक परीक्षण तालिका पर):

अपने_database_name का उपयोग करें
जाओ
WHILE (Select COUNT (*) from your_table WHERE your_id_field IS NULL)> 0
शुरू
    ROWCOUNT 1 सेट करें
    UPDATE your_table SET your_id_field = MAX (your_id_field) +1 करें
समाप्त
प्रिंट 'ऑल डन'

मैंने इसका बिल्कुल भी परीक्षण नहीं किया है, इसलिए सावधान रहें!


1
-1 सवाल का जवाब नहीं देता (जो IDENTITYकॉलम जोड़ने के बारे में है) और वैसे भी काम नहीं करेगा। UPDATE your_table SET your_id_field = MAX(your_id_field)+1तुम MAXवहाँ में चक नहीं कर सकते । एक WHEREही पंक्ति को बार-बार अपडेट करने से बचने के लिए एक खंड कहाँ है ?
मार्टिन स्मिथ

-3

यह MariaDB में काम करता है, इसलिए मैं केवल यह आशा कर सकता हूं कि यह SQL Server में करता है: आपके द्वारा अभी-अभी डाली गई आईडी कॉलम को गिराएं, फिर निम्नलिखित विवरण का उपयोग करें: -

सारणी तालिका_नाम ADD आईडी INT प्राथमिक कुंजी AUTO_INCREMENT;

किसी अन्य तालिका के लिए कोई ज़रूरत नहीं है। यह केवल एक आईडी कॉलम सम्मिलित करता है, इसे प्राथमिक सूचकांक बनाता है, और इसे अनुक्रमिक मूल्यों के साथ पॉप्युलेट करता है। यदि SQL सर्वर ऐसा नहीं करेगा, तो आपका समय बर्बाद करने के लिए मेरी माफी।


-3

सारणी तालिका_नाम ADD COLUMN ID पूर्ण नाममात्र कुंजी नहीं है AUTO_INCREMENT; यह उपयोगी हो सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.