[SQL] 7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복]
SQL7 항목에 1000 6에서 SQL 서버 2012 열 신원 증가 점프 [중복]
내 SQL 서버 2012 데이터베이스에서 자동 식별 INT 열이 제대로 증가하지 않는 이상한 시나리오가 있습니다.
내가 예를 들어, 산발적으로 단위를 건너 뛰는 기본 키를 int 자동 ID를 사용하는 테이블을 가지고 말 :
1, 2, 3, 4, 5, 1004, 1005
이것은 매우 임의의 시간에 테이블의 임의의 숫자에 무슨 일이 일어나고, 어떤 경향을 찾아 그것을 복제 할 수 없습니다.
어떻게 이런 일이 일어나고? 그것을 중지 할 수있는 방법이 있나요?
해결법
-
==============================
1.이 모두 완벽하게 정상입니다. 마이크로 소프트는, 마지막으로, 내가 추가 할 수 있습니다 SQL 서버 2012에 시퀀스를 추가 및 ID 키가 생성되는 방법을 변경했습니다. 약간의 설명이 여기를 보라.
이 모두 완벽하게 정상입니다. 마이크로 소프트는, 마지막으로, 내가 추가 할 수 있습니다 SQL 서버 2012에 시퀀스를 추가 및 ID 키가 생성되는 방법을 변경했습니다. 약간의 설명이 여기를 보라.
당신이 이전 동작을 원한다면, 당신은 할 수 있습니다 :
-
==============================
2.동일한 문제가있어, SQL 서버 2012에서 다음과 같은 버그 리포트를 발견 몇 가지 해결 방법이 거기뿐만 아니라 (하지만 노력하지 않았어요) - 문제 원인 것을 관련 참조 조건은 여전히합니다. 신원의 시드의 장애 조치 또는 다시 시작 결과
동일한 문제가있어, SQL 서버 2012에서 다음과 같은 버그 리포트를 발견 몇 가지 해결 방법이 거기뿐만 아니라 (하지만 노력하지 않았어요) - 문제 원인 것을 관련 참조 조건은 여전히합니다. 신원의 시드의 장애 조치 또는 다시 시작 결과
-
==============================
3.추적 플래그 (272)는 많은 일을 할 수 있지만, 그것은 확실히 호스팅 SQL Server Express를 설치 작동하지 않습니다. 그래서, 나는 정체성 테이블을 생성, 대신 OF 트리거를 사용합니다. 나는이 다른 사람을 도움이 희망, 및 / 또는 다른 사람에게 내 솔루션을 향상시킬 수있는 기회를 제공하고있다. 마지막 줄이 추가 된 마지막 ID 열을 반환 허용한다. 나는 일반적으로 단일 행을 추가하려면이 옵션을 사용하기 때문에,이 작품은 하나의 삽입 된 행의 ID를 반환합니다.
추적 플래그 (272)는 많은 일을 할 수 있지만, 그것은 확실히 호스팅 SQL Server Express를 설치 작동하지 않습니다. 그래서, 나는 정체성 테이블을 생성, 대신 OF 트리거를 사용합니다. 나는이 다른 사람을 도움이 희망, 및 / 또는 다른 사람에게 내 솔루션을 향상시킬 수있는 기회를 제공하고있다. 마지막 줄이 추가 된 마지막 ID 열을 반환 허용한다. 나는 일반적으로 단일 행을 추가하려면이 옵션을 사용하기 때문에,이 작품은 하나의 삽입 된 행의 ID를 반환합니다.
신원 테이블 :
CREATE TABLE [dbo].[tblsysIdentities]( [intTableId] [int] NOT NULL, [intIdentityLast] [int] NOT NULL, [strTable] [varchar](100) NOT NULL, [tsConcurrency] [timestamp] NULL, CONSTRAINT [PK_tblsysIdentities] PRIMARY KEY CLUSTERED ( [intTableId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
그리고 삽입 트리거 :
-- INSERT -- IF OBJECT_ID ('dbo.trgtblsysTrackerMessagesIdentity', 'TR') IS NOT NULL DROP TRIGGER dbo.trgtblsysTrackerMessagesIdentity; GO CREATE TRIGGER trgtblsysTrackerMessagesIdentity ON dbo.tblsysTrackerMessages INSTEAD OF INSERT AS BEGIN DECLARE @intTrackerMessageId INT DECLARE @intRowCount INT SET @intRowCount = (SELECT COUNT(*) FROM INSERTED) SET @intTrackerMessageId = (SELECT intIdentityLast FROM tblsysIdentities WHERE intTableId=1) UPDATE tblsysIdentities SET intIdentityLast = @intTrackerMessageId + @intRowCount WHERE intTableId=1 INSERT INTO tblsysTrackerMessages( [intTrackerMessageId], [intTrackerId], [strMessage], [intTrackerMessageTypeId], [datCreated], [strCreatedBy]) SELECT @intTrackerMessageId + ROW_NUMBER() OVER (ORDER BY [datCreated]) AS [intTrackerMessageId], [intTrackerId], [strMessage], [intTrackerMessageTypeId], [datCreated], [strCreatedBy] FROM INSERTED; SELECT TOP 1 @intTrackerMessageId + @intRowCount FROM INSERTED; END
from https://stackoverflow.com/questions/14162648/sql-server-2012-column-identity-increment-jumping-from-6-to-1000-on-7th-entry by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL의 '분에 의해'쿼리에 대한 행의 수를 실행 (0) | 2020.03.15 |
---|---|
[SQL] JDBC와 일괄 삽입 할 수있는 효율적인 방법 (0) | 2020.03.15 |
[SQL] MySQL의 쿼리에서, 왜 사용하는 대신 어디 조인? (0) | 2020.03.15 |
[SQL] 대 = 같은 LIKE (0) | 2020.03.15 |
[SQL] 널 열 고유 제한 조건을 만들기 (0) | 2020.03.15 |