sql एसक्यूएल सर्वर में रिकॉर्ड्स हटाने के बाद पहचान बीज रीसेट करें




sql-server database (14)

@jacob

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

मेरे लिए काम किया, मुझे बस टेबल से पहले सभी प्रविष्टियों को साफ़ करना पड़ा, फिर उपरोक्त को हटाए जाने के बाद ट्रिगर पॉइंट में जोड़ा गया। अब जब भी मैं एक प्रविष्टि हटा देता हूं वहां से लिया जाता है।

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

लेकिन चूंकि मुझे टेबल से कुछ रिकॉर्ड हटाना है, इसलिए उन तालिकाओं के लिए पहचान बीज परेशान हो जाएगा और इंडेक्स कॉलम (जो 1 की वृद्धि के साथ स्वतः उत्पन्न होता है) परेशान हो जाएगा।

रिकॉर्ड्स को हटाए जाने के बाद मैं पहचान कॉलम को रीसेट कैसे कर सकता हूं ताकि कॉलम में आरोही संख्यात्मक क्रम में अनुक्रम हो?

पहचान कॉलम को डेटाबेस में कहीं भी विदेशी कुंजी के रूप में उपयोग नहीं किया जाता है।


पहला: पहचान विशिष्टता बस: "नहीं" >> डेटाबेस निष्पादन परियोजना सहेजें

उसके बाद: पहचान विशिष्टता बस: "हाँ" >> डेटाबेस निष्पादन परियोजना सहेजें

आपका डाटाबेस आईडी, पीके 1 से शुरू करें >>


पहचान कॉलम के लिए स्पष्ट रूप से मूल्य प्रदान करने के लिए

  1. पहली बार SET Identity_Insert tblPerson ON - SET Identity_Insert tblPerson ON
  2. सम्मिलित क्वेरी में कॉलम सूची निर्दिष्ट Insert into tblPerson(PersonId, Name) values(2, 'John')

उसके बाद, आपके पास पहचान कॉलम में अंतर है, और यदि आप SQL सर्वर को मान की गणना करने की इच्छा रखते हैं, तो Identity_Insert को बंद करें।

SET Identity_Insert tblPerson OFF

=============================

यदि आपने किसी तालिका में सभी पंक्तियों को हटा दिया है, और आप पहचान कॉलम मान को रीसेट करना चाहते हैं।

डीबीसीसी जांच आदेश का उपयोग करें।

DBCC CHECKIDENT(tblPerson, RESEED, 0)

यह आदेश PersonId पहचान कॉलम रीसेट करेगा।


पहचान कॉलम को रीसेट करने के लिए इस स्क्रिप्ट को चलाएं। आपको दो बदलाव करने की आवश्यकता होगी। TableXYZ को किसी भी तालिका के साथ बदलें जिसे आप अपडेट करना चाहते हैं। साथ ही, पहचान कॉलम का नाम अस्थायी तालिका से हटा दिया जाना चाहिए। यह 35,000 पंक्तियों और 3 कॉलम वाली तालिका पर तात्कालिक था। जाहिर है, तालिका का बैकअप लें और पहले परीक्षण वातावरण में इसे आज़माएं।

select * 
into #temp
From tableXYZ

set identity_insert tableXYZ ON

truncate table tableXYZ

alter table #temp drop column (nameOfIdentityColumn)

set identity_insert tableXYZ OFF

insert into tableXYZ
select * from #temp

मैंने @anil shahs जवाब की कोशिश की और यह पहचान को रीसेट कर दिया। लेकिन जब एक नई पंक्ति डाली गई तो उसे identity = 2 मिली। तो इसके बजाय मैंने इसे वाक्यविन्यास बदल दिया:

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

फिर पहली पंक्ति पहचान = 1 प्राप्त होगी।


यह एक आम सवाल है और जवाब हमेशा एक जैसा है: ऐसा मत करो। पहचान मूल्यों को मनमाने ढंग से माना जाना चाहिए और, इस तरह, कोई "सही" आदेश नहीं है।


पहचान आईडी को नई आईडी के साथ रीसेट करें ...

DECLARE @MAX INT
SELECT @MAX=MAX(ISNULL(Id,0)) FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)

हालांकि अधिकांश उत्तर 0 RESEED का सुझाव दे रहे हैं, और कुछ इसे TRUNCATED तालिकाओं के लिए एक दोष के रूप में देखते हैं, माइक्रोसॉफ्ट के पास एक समाधान है जो ID छोड़ देता है

DBCC CHECKIDENT ('[TestTable]', RESEED)

यह तालिका की जांच करेगा और अगली ID रीसेट करेगा। यह एमएस एसक्यूएल 2005 के बाद से वर्तमान में उपलब्ध है।

MSDN


जारी करने के लिए 2 आदेश चाल कर सकते हैं

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

पहले पहचान को शून्य पर रीसेट करें, और अगला इसे अगले उपलब्ध मान - जैकोब पर सेट करेगा


इस संग्रहीत प्रक्रिया का प्रयोग करें:

IF (object_id('[dbo].[pResetIdentityField]') IS NULL)
  BEGIN
    EXEC('CREATE PROCEDURE [dbo].[pResetIdentityField] AS SELECT 1 FROM DUMMY');
  END
GO

SET  ANSI_NULLS ON
GO
SET  QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[pResetIdentityField]
  @pSchemaName NVARCHAR(1000)
, @pTableName NVARCHAR(1000) AS
DECLARE @max   INT;
DECLARE @fullTableName   NVARCHAR(2000) = @pSchemaName + '.' + @pTableName;

DECLARE @identityColumn   NVARCHAR(1000);

SELECT @identityColumn = c.[name]
FROM sys.tables t
     INNER JOIN sys.schemas s ON t.[schema_id] = s.[schema_id]
     INNER JOIN sys.columns c ON c.[object_id] = t.[object_id]
WHERE     c.is_identity = 1
      AND t.name = @pTableName
      AND s.[name] = @pSchemaName

IF @identityColumn IS NULL
  BEGIN
    RAISERROR(
      'One of the following is true: 1. the table you specified doesn''t have an identity field, 2. you specified an invalid schema, 3. you specified an invalid table'
    , 16
    , 1);
    RETURN;
  END;

DECLARE @sqlString   NVARCHAR(MAX) = N'SELECT @maxOut = max(' + @identityColumn + ') FROM ' + @fullTableName;

EXECUTE sp_executesql @stmt = @sqlString, @params = N'@maxOut int OUTPUT', @maxOut = @max OUTPUT

IF @max IS NULL
  SET @max = 0

print(@max)

DBCC CHECKIDENT (@fullTableName, RESEED, @max)
go

--exec pResetIdentityField 'dbo', 'Table'

ट्रंकेट टेबल को प्राथमिकता दी जाती है क्योंकि यह रिकॉर्ड्स को साफ़ करता है, काउंटर को रीसेट करता है और डिस स्पेस को पुनः प्राप्त करता है।

हटाएं और चेकइडेंट का उपयोग केवल तभी किया जाना चाहिए जहां विदेशी कुंजी आपको छंटनी से रोकती हैं


हालांकि अधिकांश उत्तर 0 पर RESEED का सुझाव दे रहे हैं, लेकिन कई बार हमें केवल अगले आईडी पर शोध करने की आवश्यकता है

declare @max int
select @max=max([Id])from [TestTable]
if @max IS NUll   //check when max is returned as null
  SET @max = 0
DBCC CHECKIDENT ('[TestTable]', RESEED,@max)

यह तालिका की जांच करेगा और अगली आईडी पर रीसेट करेगा।


DBCC CHECKIDENT ('TestTable', RESEED, 0)
GO

जहां 0 identity प्रारंभ मूल्य है


DBCC CHECKIDENT (<TableName>, reseed, 0)

यह वर्तमान पहचान मान 0 पर सेट करेगा।

अगले मूल्य को सम्मिलित करने पर, पहचान मान 1 तक बढ़ जाता है।





azure-sql-database