나는 삽입됨 레코드전자문서의 SQL Server 에 데이터베이스 테이블. 한 테이블에 기본 키 정의 및 자동 증분식 아이디 시드입니다 "Yes" 로 설정되어 있습니다. 이 작업은 주로 SQL Azure, 각 테이블에는 정의된 기본 키 정체성을 가질 수 있기 때문이다.
그러나 저는 테이블에서 적립율은 미친 사람들을 위해 일부 레코드전자문서의 삭제하시겠습니까 아이디 시드입니다 테이블 인덱스 컬럼 (원하는거요 통해 자동으로 증분우선순위수준우선 1) 및 미친 받게 된다.
데이터베이스에서 외래 키 어디든요 아이디 열 사용되지 않는다는 것입니다.
'DBCC 크레키덴트' 이 명령을 사용할 아이디 관리 재설정하려면 카운터입니다. 명령 구문은 다음과 같습니다.
DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]
예:
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
이 것은 이제 더 이상 지원되지 않지만, 이전 버전의 Azure SQL 데이터베이스를 사용할 수 있습니다.
Sql Server 버전에 걸쳐 다양한 new_reseed_value 유념하십시오 '' 인수는 따르면 문서용으로:
>. 만약 다음 행은 테이블에서 행을 networkr. 삽입됨 new_reseed_value 함께 값입니다. Sql Server 2008년 R2 버전, 이에 앞서 다음 행을 삽입됨 /dev/raw/raw1 new_reseed_value + 현재 증분값을.
그러나 나는 이 정보를 확인할 수 있다 (실제로 그냥 일반 잘못된) 오해의 소지가 있음을 관찰할 수 있기 때문에 최소한 SQL Server 2012년 여전히 /dev/raw/raw1 new_reseed_value + 현재 증분값을 없다. 마이크로소프트 (ms) 의 예를 찾을 수 있다 'c' 는 자체 평소의 동일한 페이지:
>. 현재 id 값을 강요하는 새로운 가치를 c. >. >. 다음 예제에서는 docname 현재 id 의 값 >. 아다레스티페 표를 아다레스티페이드 열에서 값을 10. >. 때문에 기존 11 행, 행 삽입됨 사용할 다음 표에 >. 즉, 새로운 값으로 현재 증분값을 대해 정의된 >. 열 값 플러스 (+) 1.
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
그러나 이 모든 새로운 SQL Server 버전에 대한 다양한 옵션을 찻입 있다. 확인할 수 있는 유일한 방법인 것 같아요,) 는 마이크로소프트 (ms) 의 자체 테스트를 할 때까지 선택해제합니다 셨으며 클린업합니다 붽뎄 전에 실제 사용.
이 점에 주의해야 합니다 만약 all 데이터는 제거될 테이블에서 통해 '삭제' (즉, no '어디서' 항), 그리고 as long as a) 의 권한에서 정보기술 (it), b) 를 참조하는 fk 없는 표 (여기 있을 때 나타나는 경우) 을 보다 효율적인 '기본' 테이블 '약간만이라도 잘라냅니다 않으므로' 'id' 시드입니다 삭제하시겠습니까 and 리셋합니다 동시에건간에. 자세한 내용은 다음 페이지를 수행됨을 MSDN 에서 장치당 잘라냅니다 표:
>. 테이블 기술서임을 삭제하시겠습니까 잘라냅니다 비교할 때, 다음과 같은 이점이 있습니다. >. >. 적은 트랜잭션 로그 공간 사용됩니다. >. >. 한 번에 하나씩 삭제 기술서임을 절감뿐만 행뿐만 트랜잭션 로그 기록 각 항목을 삭제할 행. 데이터를 저장하는 데 사용되는 데이터 페이지 테이블 절감뿐만 잘라냅니다 의해 할당 취소 만 페이지 테이블 데이터 및 레코드전자문서의 할당 트랜잭션 로그. >. >. 잠급니다 주로 사용하는 수가 있다. >. >. 각 행은 테이블에서 행을 사용하여 실행할 때 문이 삭제하시겠습니까 잠급니다 잠겼음을 삭제용으로. 항상 잘라냅니다 표 (잠급니다 스키마 (sch m) 등) 및 페이지 테이블 잠급니다 각 행의 수는 없습니다. >. >. * 예외 없이 제로 페이지 테이블의 남아 있다. >. >. 문이 실행된 후, 빈 페이지 테이블 삭제하시겠습니까 계속 포함되어 있습니다. 예를 들어, 빈 페이지가 없이 해제할 수 없는 최소 힙 (heap) 에서 단독 (LCK_M_X) 테이블 푸십시오. 삭제 작업이 사용하지 않는 경우 테이블 좉툑, 테이블 (힙) 가 많이 들어 빈 페이지가. 하지만, 이러한 페이지를 떠날 수 있는 빈 페이지가 indexe 대한 삭제 작업을 통해 신속하게 지우는중 적립율은 할당 해제된 뒤에 백그라운드 프로세스. >. >. 아이디 열에 엇회전식 테이블에는 경우 해당 열에 대해 정의된 값이 재설정됩니다 시드입니다 열. 정의한 시드입니다 없는 경우, 기본값입니다 1 사용됩니다. 아이디 엇회전식 대신 삭제하시겠습니까 유지하려면 사용합니다.
그래서 다음과 같습니다.
DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);
그냥 됩니다.
TRUNCATE TABLE [MyTable];
자세한 내용은 '표' 잘라냅니다 붽뎄 (링크됨 위) 에 대한 자세한 정보는 제한, etc.
비록 한 번 시드 제안하고 있지만, 가장 많은 대답이 0 으로 그냥 우리가 할 수 있는 시드 다음 Id
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)
이렇게 하면 확인란 테이블 및 재설정됨 다음 ID.
답변 및 it 재설정하십시오 샤 '찾았다' @anil 방침이었다. 그러나 이 때는 새로운 행일 삽입된 'id = 2' 다. 그래서 내가 대신 변경일 구문을 다음과 같이 사용된다.
DELETE FROM [TestTable]
DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO
첫 번째 행에서 다음 아이디 = 1 받게 된다.
비록 대부분의 '시드' 를 제안하고 그 대답이 '0', 그리고 이를 위해 일부 지켜보리니 결함 '이' ID '잘린' 테이블뿐 마이크로소프트 (ms) 가 있는 솔루션을 제외시킵니다
DBCC CHECKIDENT ('[TestTable]', RESEED)
이렇게 하면 확인란 테이블 및 재설정됨 다음 'ID'. 현재 MS SQL 2005년 이후 이 사용할 수 있었습니다.
아이디 함께 열 재설정하지 새로운 id 를 사용합니다.
DECLARE @MAX INT
SELECT @MAX=ISNULL(MAX(Id),0) FROM [TestTable]
DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)
재설정하려면 실행하십시오 스크립트입니다 id 열. 두 가지 변경 사항이 만들어야 합니다. 테이블 업데이트하려면 복귀시킴 타바레스리스 있는모든 함께 합니다. 또한 임시 테이블 이름, 아이디 열 요구사항뿐 떨어졌다. 이는 즉시 테이블을 함께 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
이 저장 프로시저:
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'
그냥 하는걸로 my answer. Sql server 2008년 r2 에 걸쳐 왔는지 이상한 고려해야 할 수 있다.
drop table test01
create table test01 (Id int identity(1,1), descr nvarchar(10))
execute pResetIdentityField 'dbo', 'test01'
insert into test01 (descr) values('Item 1')
select * from test01
delete from test01
execute pResetIdentityField 'dbo', 'test01'
insert into test01 (descr) values('Item 1')
select * from test01
첫 번째 선택, 품목 1 이면 '0'.
두 번째, 품목 1 이면 '1'. 다음 표는 재설정하지 실행하십시오 직후 창조하 값이 0 인 경우. I am not 놀란 장난하는거아니고, Microsoft 그러겄지 afaq afnor 그런거 없습니다. 우리 사회의 때문에 나는 가끔 내가 표 참조 테이블 스크립트 파일에 있는 채우는 실행하십시오 재작성할 때 이미 생성된 후, 때로는 테이블은.
전체 삭제, 내가 이 아이디 카운트입니다 행과 재설정하십시오 (SQL Server 2008년 R2)
USE mydb
-- ##################################################################################################################
-- DANGEROUS!!!! USE WITH CARE
-- ##################################################################################################################
DECLARE
db_cursor CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_CATALOG = 'mydb'
DECLARE @tblname VARCHAR(50)
SET @tblname = ''
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @tblname
WHILE @@FETCH_STATUS = 0
BEGIN
IF CHARINDEX('mycommonwordforalltablesIwanttodothisto', @tblname) > 0
BEGIN
EXEC('DELETE FROM ' + @tblname)
DBCC CHECKIDENT (@tblname, RESEED, 0)
END
FETCH NEXT FROM db_cursor INTO @tblname
END
CLOSE db_cursor
DEALLOCATE db_cursor
GO
난 다음 스크립트를 사용하여 이 작업을 수행할 수 있습니다. # 39 의 there& 생성하는 것 하나만 있는 경우, 이는 책정안 " error", 모두 삭제한 테이블에서 행을 IDENT_CURRENT '및' 는 현재 1 로 시작하는 테이블의 행, 즉 하나만 있었다.
DECLARE @maxID int = (SELECT MAX(ID) FROM dbo.Tbl)
;
IF @maxID IS NULL
IF (SELECT IDENT_CURRENT('dbo.Tbl')) > 1
DBCC CHECKIDENT ('dbo.Tbl', RESEED, 0)
ELSE
DBCC CHECKIDENT ('dbo.Tbl', RESEED, 1)
;
ELSE
DBCC CHECKIDENT ('dbo.Tbl', RESEED, @maxID)
;
그 때 기록을 모두 삭제하는 대신 사용할 수 있기 때문에 언제나 더 잘라냅니다 # 39, t doesn& 로그 공간을 사용할 수 있다.
해야 할 경우, 항상 기억하고 시드입니다 재설정하려면 삭제하시겠습니까 table) 가 사용한 경우 절대 채워지며 'DBCC 크레키덴트 (& # 39, tablenem& # 39, 시드, 0)' 첫 번째 녹음 후 받을 것이라고 id = 0 msdn 문서용으로 에서 언급된 바와 같이
>. T , 와 # 39 에 케이스에만 재구축합니다 인덱스화할 don& 잃을 걱정 >. 이 일련의 id '는 일반적인 경우에.