SQL Server에서 레코드를 삭제 한 후 ID 시드 재설정


682

SQL Server 데이터베이스 테이블에 레코드를 삽입했습니다. 테이블에 기본 키가 정의되어 있고 자동 증분 ID 시드가 "예"로 설정되어 있습니다. 이는 SQL Azure에서 각 테이블에 기본 키와 ID가 정의되어 있어야하기 때문에 주로 수행됩니다.

그러나 테이블에서 일부 레코드를 삭제해야하기 때문에 해당 테이블의 ID 시드가 방해 받고 인덱스 열 (1 씩 증가하여 자동 생성됨)이 방해를받습니다.

레코드를 삭제 한 후 열이 순서대로 오름차순으로 정렬되도록 ID 열을 재설정하려면 어떻게해야합니까?

ID 열은 데이터베이스의 어느 곳에서나 외래 키로 사용되지 않습니다.


4
"SQL Azure에서"- "각 테이블에는 기본 키가 있어야합니다"-true- "and Identity Defined"-false 아이덴티티와 기본 키는 직교 개념입니다. ID 열은 테이블의 PK 일 필요는 없습니다. 기본 키는 ID 열일 필요는 없습니다.
Damien_The_Unbeliever

확인. 내 개념이 잘못되었을 수 있습니다. 그러나 이제 PK와 Identity Seed로 테이블 구조를 정의했습니다. 일부 행을 삭제해야하는 경우 올바른 숫자 오름차순으로 Identity Seed를 재설정하는 방법
xorpower

29
나는 항상 당신이 신원 열에 생성 된 실제 숫자 값에 관심이 있다면 그것들을 잘못 사용하고 있다고 주장합니다. ID 열에 대해 신경 써야 할 것은 자동으로 고유 값을 생성하고 (yay!) 이러한 값을 숫자 열에 저장할 수 있다는 것입니다 (이 비트는 열이 이러한 값을 보유하도록 선언하는 데만 해당됨). 다른 사람에게 보여 주면 안되므로 어떤 가치를 가져도 상관 없습니다.
Damien_The_Unbeliever

당신은 기본 키는 SQL DB를 V12 필수 아니라고 언급 된 다른로 식별하지만 참고하시기 바랍니다 DBCC 검사를 사용할 수 있습니다
Satya_MSFT

답변:


1099

DBCC CHECKIDENT관리 명령은 신원 카운터를 재설정하는 데 사용됩니다. 명령 구문은 다음과 같습니다.

DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]

예:

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

이전 버전의 Azure SQL Database에서는 지원되지 않았지만 지금 지원됩니다.


유의하시기 바랍니다 new_reseed_value인수는 SQL Server 버전을 통해 변화되는 문서에 따라 :

테이블에 행이 있으면 다음 행이 new_reseed_value 값 과 함께 삽입됩니다 . SQL Server 2008 R2 이전 버전에서 삽입 된 다음 행은 new_reseed_value + 현재 증분 값을 사용합니다.

그러나 관찰 된 동작은 적어도 SQL Server 2012가 여전히 new_reseed_value + 현재 증분 값 논리를 사용한다는 것을 나타 내기 때문에이 정보가 잘못된 것입니다 (실제로는 잘못되었습니다) . 마이크로 소프트는 심지어 같은 페이지에서 발견 된 것과 도 모순된다 :Example C

C. 현재 아이덴티티 값을 새로운 값으로 강제

다음 예제에서는 AddressType 테이블의 AddressTypeID 열에있는 현재 ID 값을 10으로 설정합니다. 테이블에 기존 행이 있으므로 삽입 된 다음 행은 11을 값, 즉 새 현재 증분 값으로 사용합니다. 열 값에 1을 더한 값입니다.

USE AdventureWorks2012;  
GO  
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);  
GO

그럼에도 불구하고 이것은 모두 최신 SQL Server 버전에서 다른 동작에 대한 옵션을 남깁니다. Microsoft가 자체 문서에서 내용을 정리할 때까지 사용하기 전에 실제 테스트를 수행하는 것이 유일한 방법이라고 생각합니다.


23
구문은 다음과 같습니다. DBCC CHECKIDENT ( '[TestTable]', RESEED, 0) GO
Biki

2
DBCC CHECKIDENT다음 릴리스 (V12 / Sterling)에서 지원되는 것으로 보입니다 . azure.microsoft.com/en-us/documentation/articles/… 이 특정 상황에서는 여전히 TRUNCATE TABLE :)을 권장합니다.
Solomon Rutzky

1
"GO"가 다른 줄에 올 때까지 그것은 작동하지 않았습니다.
mrówa

1
같은 줄에 GO 키워드로 인해 구문에 플래그가 지정되었습니다. 이유를 모르겠습니다. 줄 아래로 움직일 수 있습니까? 이 줄을 50 번 복사하여 붙여 넣었고 이제 돌아가서 수정해야합니다.
AnotherDeveloper 2016 년

4
나를 위해 완벽하게 일했습니다. 테이블을 다시 시드 할 때 첫 번째 레코드가 ID 1이되도록 다시 시드하려면 다음 시드가 ID 1이되도록 다시 시드 명령을 0으로 다시 시드해야합니다.
Mike Upjohn

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

여기서 0은 identity시작 값입니다.


15
방금 호출 한 것처럼 테이블이 비어있는 경우 TRUNCATE새 시드 값은 다음에 사용할 값이어야합니다 (예 : 0이 아닌 1). 테이블이 비어 있지 않으면를 사용합니다 new_reseed_value + 1. MSDN
kjbartel

2
@kjbartel, Anil 및 기타 : "테이블이 비어있는"것만 큼 간단하지 않습니다. 문서는 테이블 인해 비어있을 때의 경우 실종됐다 DELETE,하지 TRUNCATE,이 경우 그것은 또한입니다 new_reseed+value + 1. 이에 대한 게시물을 작성하고 일부 테스트를 통해 실제 동작을 보여주고 실제 문서를 업데이트했습니다 (현재 GitHub에 있기 때문에 가능합니다 ). .
Solomon Rutzky

87

이 경우 주목해야 하는 모든 데이터를 통해 테이블로부터 삭제되고 DELETE(즉 아니오 WHERE절) 다음만큼 a) 권한이 허용과 같이 b)로 표시되는 테이블 (참조 더 FKS 없다 여기서는 TRUNCATE TABLE더 효율적 DELETE 이며IDENTITY 시드를 재설정하기 때문에 사용하는 것이 좋습니다 . TRUNCATE TABLE 의 MSDN 페이지에서 다음 세부 사항을 가져옵니다 .

DELETE 문과 비교하여 TRUNCATE TABLE은 다음과 같은 장점이 있습니다.

  • 적은 트랜잭션 로그 공간이 사용됩니다.

    DELETE 문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다. TRUNCATE TABLE은 테이블 데이터를 저장하는 데 사용 된 데이터 페이지를 할당 해제하여 데이터를 제거하고 페이지 할당 해제 만 트랜잭션 로그에 기록합니다.

  • 일반적으로 잠금이 적습니다.

    행 잠금을 사용하여 DELETE 문을 실행하면 테이블의 각 행이 삭제를 위해 잠 깁니다. TRUNCATE TABLE은 항상 테이블 (스키마 (SCH-M) 잠금 포함)과 페이지를 잠그지 만 각 행은 잠그지 않습니다.

  • 예외없이, 0 페이지가 테이블에 남아 있습니다.

    DELETE 문이 실행 된 후에도 테이블은 여전히 ​​빈 페이지를 포함 할 수 있습니다. 예를 들어, 적어도 독점 (LCK_M_X) 테이블 잠금이 없으면 힙의 빈 페이지를 할당 해제 할 수 없습니다. 삭제 조작에서 테이블 잠금을 사용하지 않으면 테이블 (힙)에 많은 빈 페이지가 포함됩니다. 색인의 경우, 삭제 작업은 빈 페이지를 남겨 둘 수 있지만 이러한 페이지는 백그라운드 정리 프로세스에 의해 신속하게 할당 해제됩니다.

테이블에 ID 열이 포함되어 있으면 해당 열의 카운터가 열에 대해 정의 된 시드 값으로 재설정됩니다. 시드가 정의되지 않은 경우 기본값 1이 사용됩니다. ID 카운터를 유지하려면 대신 DELETE를 사용하십시오.

그래서 다음과 같이 :

DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);

그냥된다 :

TRUNCATE TABLE [MyTable];

TRUNCATE TABLE제한 등에 대한 추가 정보는 위의 링크 된 설명서를 참조하십시오 .


8
올바른 환경에서 더 효율적이지만 항상 옵션은 아닙니다. FK가 정의 된 테이블에서는 잘림이 실행되지 않습니다. 종속 레코드가 없어도 제한 조건이 존재하면 잘림이 실패합니다. 또한 잘라내기에는 삭제에만 DELETE 만 필요한 ALTER 권한이 필요합니다.
Rozwel

3
@Rozwel 사실이지만 적절한 권한이 있어야한다는 답변을 이미 검증했습니다. 또한이 질문에는 구체적으로 FK가 없다고 명시되어 있습니다. 그러나 명확성을 위해 "FK 없음"제한을 지정하도록 업데이트했습니다. 지적 해 주셔서 감사합니다.
Solomon Rutzky

1
단지 FICK는 모든 FK가 잘림을 차단한다는 것입니다. PK 또는 ID 열의 일부가 아닌 고유 제한 조건에 대해 FK를 가질 수 있습니다 (비정상적 임).
Rozwel

1
@Rozwel 다시 한 번 사실이지만 PK가 Azure SQL Database에 필요하다는 OP의 이해 (올바르거나 아님)로 인해 PK 만 존재한다는 점에서 고유 제약 조건이 없다고 가정하는 것이 합리적입니다. 어쨌든, 나는 모호함을 줄이기 위해 모두 있으므로 다시 업데이트했습니다. 감사.
Solomon Rutzky

외래 키가 테이블에있는 것은 이례적인 일이 아니며 외래 키가 있으면 TRUNCATE TABLE을 금지합니다. 방금 테이블의 다른 두 열과 외래 테이블의 고유 인덱스에 대해 적용되는 외래 키가있는 테이블에서 TRUNCATE TABLE을 실행하려고 시도했을 때 오늘이 어려운 방법을 발견했습니다.
David A. Grey

83

대부분의 답변에서 RESEED를 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로 재설정합니다.


2
이 시간의 100 % 작동하는 유일한 해답이다
반전 엔지니어

3
조금 더 짧은 :declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Guillermo Prandi

61

나는 @anil shahs대답을 시도 했고 그것은 정체성을 재설정했다. 그러나 새로운 행이 삽입되면 identity = 2. 대신 구문을 다음과 같이 변경했습니다.

DELETE FROM [TestTable]

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

그런 다음 첫 번째 행은 identity = 1을 얻습니다.



16

대부분의 답변은 제안하고 있지만 RESEED0, 일부는의 결함으로 이것을 볼 때 TRUNCATED테이블, 마이크로 소프트는 그 해결책을 가지고 제외합니다ID

DBCC CHECKIDENT ('[TestTable]', RESEED)

테이블을 확인하고 다음으로 다시 설정합니다 ID. 이것은 MS SQL 2005부터 현재까지 사용 가능합니다.

https://msdn.microsoft.com/en-us/library/ms176057.aspx


1
불행하게도 그것은 사실이 아닙니다. MS SQL 2014 서버에 대해 방금 확인했습니다.
alehro

1
실제로, 그것은 SQL 2014의 경우에 해당됩니다. 방금 테스트 한 결과 저에게 효과적이었습니다.
다니엘 다이슨

2
이것은 SQL 2012에서 일관되지 않게 작동합니다. 때로는 예상대로 다음 사용 가능한 것을 사용하고 때로는 테이블에서 오래된 값에 걸리는 것처럼 보입니다. 시드 지정은 이미 작동합니다.
Dan Field

SQL 2016에서 나를 위해 작동하지 않습니다-ID 시드를 그대로 둡니다. 한 번만 제대로 작동했을 수도 있지만 손가락 문제 일 수도 있습니다. 다시 작동시킬 수 없음
리버스 엔지니어

이 메시지는 성공을 나타내지 Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'.만 새 삽입시 여전히 잘못된 시드를 사용하고 있습니다.
Denziloe

7

2 명령을 발행하면 트릭을 수행 할 수 있습니다

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

첫 번째는 ID를 0으로 재설정하고 다음은 사용 가능한 다음 값-jacob로 설정합니다


2
DBCC CHECKIDENT ( '[TestTable]', RESEED)가 다음 사용 가능한 값으로 다시 시드되지 않습니다
Atal Kishore

"Reseed identity columns"옵션이 설정된 경우 RedGate 데이터 비교에서 사용되는 방법 입니다. 광범위하게 테스트했으며 (RedGate 도구가 아닌 SQL 코드를 의미) 안정적으로 작동합니다. (평가판을 가끔 사용하는 것 외에는 RedGate와 아무 관련이 없습니다.)
리버스 엔지니어

6

jacob

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

나를 위해 일한 것은 방금 테이블에서 모든 항목을 지우고 삭제 후 트리거 지점에 위의 항목을 추가해야했습니다. 이제 내가 삭제할 때마다 항목이 거기에서 가져옵니다.


DBCC CHECKIDENT는 삭제 후에 만 ​​작동합니다. 잘림을 사용할 수도 있습니다. 그러나 나머지 데이터가 필요한 경우 사용하지 마십시오. 또한 자르기는 삭제 된 레코드 수를 제공하지 않습니다.
user763539

6

Truncate 테이블은 레코드를 지우고 카운터를 재설정하며 디스크 공간을 회수하기 때문에 선호됩니다.

Delete그리고 CheckIdent경우에만 외부 키가 절단하지 못하도록를 사용해야합니다.


5

새 ID로 ID 열 재설정 ...

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

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

4

이것은 일반적인 질문이며 대답은 항상 동일합니다.하지 마십시오. 동일성 값은 임의적 인 것으로 취급되어야하며, 따라서 "올바른"순서는 없습니다.


15
프로덕션 환경에서는 사실이지만 개발하는 동안 특정 엔티티에는 시드 스크립트로 채워진 특정 ID가 있음을 기억하고 싶습니다. 개발 중에 데이터베이스를 훨씬 쉽게 탐색 할 수 있습니다.
Francois Botha

7
이와 같은 답변은 완전히 이론적 인 것이며 실제 요구를 거의 준수하지 않습니다. 당신의 교리로 사람들을 세뇌하는 대신에, 당신은 OP 질문에 대답합니다 ...
Serj Sagan

1
멋진 이야기, 친구. 내 경합은 이것입니다. 열의 값을 지정하려면 열에서 그렇게하기 어려운 속성을 선택하지 마십시오. 코드 냄새는 다음과 같습니다. 레코드를 테이블에 삽입 할 때마다 ID 열의 값을 지정하면 ID 열이 없습니다. ID의 전체 요점은 서버가 가치를 창출하도록하는 것입니다. 따라서 그 시간을 재정의하면 0이 아닌 비용으로 아무것도 얻지 못합니다. 또한 adhominem 논쟁에 대한 좋은 연구.
Ben

5
나는 당신의 경합에 확실히 동의합니다. 액면가를 보면 OP가 확실히 잘못하고 있지만 OP가 자신의 질문에 대답하는 것과 관련이 없다고 생각한 게시물에는 더 깊이 언급 할 필요가 없습니다. 따라서 질문에 대답하고, 답변의 일부로 "해야 할 것과하지 말아야 할 것"조언을 제공하십시오. 그건 그렇고, 나는 결코 당신의 성격을 공격하지 않았다 ... ad hominem은 내가 당신을 바보라고 부르는 것을 의미합니다 ...
Serj Sagan

1
대부분의 경우 확실히 사실이지만, 테이블을 다시 시드하는 것이 합법적 인 상황이 있습니다. 예를 들어, 나는 이전 필드에서 기존 행을 대체하기 위해 특정 지점에서 시작 해야하는 그린 필드 프로젝트를 진행하고 있습니다. 개발 중 시드는 합법적 인 사용 사례 인 IMO입니다.
David A. Grey

3

이 스크립트를 실행하여 식별 컬럼을 재설정하십시오. 두 가지 사항을 변경해야합니다. 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

3
SET IDENTITY_INSERT 위치가 잘못되었습니다. 그것은 TRUNCATE 주위에 가지 않는다, 그것은 INSERT INTO (따라서 identity_의 주위 간다 INSERT를 ). 또한 이것은 데이터를 보존해야 할 때만 사용해야 하며 , 그렇지 않으면 단일 TRUNCATE 문을 실행하는 것보다 비효율적입니다.
Solomon Rutzky

1
DBCC CHECKIDENT (<TableName>, reseed, 0)

현재 ID 값을 0으로 설정합니다.

다음 값을 삽입하면 ID 값이 1로 증가합니다.


1

이 저장 프로 시저를 사용하십시오.

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'

내 대답을 다시 방문하십시오. 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

첫 번째 선택은 0, Item 1 .

두 번째는 생산합니다 1, Item 1. 테이블을 만든 직후에 재설정을 실행하면 다음 값은 0입니다. 솔직히 말해서 Microsoft 가이 물건을 올바르게 얻을 수 없다는 것은 놀라운 일이 아닙니다. 테이블을 다시 작성한 후 때때로 테이블이 이미 작성된 경우에 때때로 실행되는 참조 테이블을 채우는 스크립트 파일이 있기 때문에이를 발견했습니다.


1

다음 스크립트를 사용하여이 작업을 수행합니다. 테이블에서 모든 행을 삭제하고 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)
;

0

완전한 DELETE 행과 IDENTITY 수를 재설정하려면 이것을 사용합니다 (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

0

테이블 전체를 정리하지 않는 한 0으로 다시 시드하는 것은 실용적이지 않습니다.

다른 현명한 Anthony Raymond의 답변은 완벽합니다. 최대 식별 열을 먼저 얻은 다음 최대로 시드하십시오.


0

개발 중에 많은 테이블에 대해이 작업을 수행하려고 시도했으며 이것이 매력으로 작동합니다.

DBCC CHECKIDENT('www.newsType', RESEED, 1);
DBCC CHECKIDENT('www.newsType', RESEED);

따라서 먼저 1로 설정 한 다음 테이블에있는 행의 가장 높은 인덱스로 설정하십시오. idex의 빠르고 쉬운 휴식.


-2

항상 TRUNCATE 를 사용하는 것이 좋습니다 로그 공간도 사용하지 않으므로 모든 레코드를 삭제하는 대신 가능하면 것이 좋습니다.

삭제해야하고 시드를 재설정 해야하는 경우 항상 테이블이 채워지지 않고 사용한 DBCC CHECKIDENT('tablenem',RESEED,0) 경우 첫 번째 레코드는 msdn 설명서에 명시된대로 ID = 0을 얻습니다.

귀하의 경우 인덱스를 다시 작성 하고 일반적인 시나리오이므로 일련의 ID를 잃을 염려가 없습니다.


3
아이디어는 일부 레코드 만 삭제하는 것 같습니다 .
Drumbeg

6
이것은 명백한 잘못입니다. 잘라내기를 사용하는 것이 <i> 항상 </ i> 더 좋지 않으며 실제로는 매우 제한적이고 특정한 시나리오에서만 더 좋습니다. 천국은 누군가가 당신의 조언을 따르고 롤백해야한다고 금지했습니다.
Thronk

1
@Thronk 왜 예상 한대로 동작 TRUNCATE하지 못하도록 암시 ROLLBACK합니까? ROLLBACK은 여전히 ​​롤백됩니다. 경우에도 DB로 설정됩니다 BULK_LOGGED.
Solomon Rutzky

2
TRUNCATE는 DDL 작업이며 로그 파일에 기록되지 않습니다. 그것이 거래의 일부가 아닌 한 (질문이나 대답에서 언급되지 않은). 누군가가 무언가가 항상 사실이라고 말할 때마다, 그들이 틀렸다는 것이 꽤 안전합니다.
Thronk

이것은 시퀀스가 이전에 사용되었는지 여부에 따라 RESEED 동작에 차이가 있음을 유념 하는 유일한 대답입니다. 일부 테이블이 이전에 채워진 여러 개의 테이블 에서 동일한 값을 다시 시드하면 하면 각 테이블에 삽입 된 첫 번째 레코드의 초기 값 달라 .
사이먼 콜맨

-4

먼저 : 신원 사양 그냥 : "아니오">> 데이터베이스 저장 프로젝트 실행

그 후 : Identity Specification Just : "YES">> 데이터베이스 실행 프로젝트 실행

데이터베이스 ID, PK 1부터 시작 >>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.