2014-02-19 2 views
-2

내가 모든 레코드에 의해 ID를 증가 할 테이블 만들려면이 코드를 사용 증가 :SQL 서버 삭제하고

CREATE TABLE new_employees 
(
ID int IDENTITY(1,1), 
NAME varchar (20), 
BALANCE int 
) 

을하지만, 문제가,의 내가 ID (6)을 삭제하고 싶은 말은하자 또 다른 기록을 추가 한 후 하지만 새로운 레코드는 그 id 6을 취하지 않지만 다음 id (7)로 이동합니다. 어떻게 ID를 감소 시키면 레코드를 삭제하면 모든 레코드를 삭제할 수 있습니까?

+0

어떤 이점이 있습니까? 나는 장기적으로 이것은 일을 더 어렵게 만들 것이라고 생각합니다. – Elias

+0

증분 값을 유지하기 위해 ID를 사용하지 마십시오. 일반적으로 삭제되지는 않지만 삭제 된 행이없는 경우에도 gab이있는 경우를 쉽게 실행할 수 있습니다. 당신은 스스로 가치를 유지해야합니다. 그러나 나는 엘리야에 동의합니다. 이점은 무엇입니까? 행 번호가 유지되지 않고 필요할 경우 언제든지 행 번호를 선택할 수 있습니다. –

+5

당신은 ** 그렇게하려고하지 않아야합니다 !! 이미 행에 이미 할당 된 값을 "재활용"하는 것은 대단히 나쁜 생각입니다! ** 이럴 수 없어! ** –

답변

1

나쁜 습관이지만 여전히 가능합니다.

이처럼 할 수있는 : Reset AutoIncrement in SQL Server after Delete

+0

마지막 레코드가 삭제되고 테이블이 비어있는 경우 문제를 피하려면'select @max = coalesce (max (key), 1) from table; '과 같은 것을 사용해야합니다. – FrankPl

+0

@FrankPl 아주 좋습니다. 고마워요. –

+0

@Fabian Bigler ID가 1-10이고 ID가 8 인 경우 어떻게됩니까? 이제 1-7 & 9-10이 있습니다. 이 일이 어떻게됩니까? 나는 MAX가 여전히 10이 될 것이므로 다음 ID가 여전히 11이 될 것이라고 생각하고있다. –

0

수 없습니다. 그것은 식별 열이 작동하는 방식이 아닙니다. 사실, 값은 삭제하지 않고도 갭을 가질 수 있습니다. 대신

, 당신은 쿼리 할 때 계산을 할 당신이 정말로 업데이트를 트리거하거나 유사한 논리를 사용하려는 경우

select row_number() over (partition by id) as seqnum 

당신는 열을 유지 관리 할 수 ​​있습니다. 갭은 다른 이유로 인해 발생할 수 있기 때문에 ID는 이런 식으로 작동하지 않습니다.

+0

사실 dbcc checkident를 사용하여 ID를 다시 시드 할 수 있습니다. 하지만 질문에 대한 대답을 이해하는 방법에 따라 달라집니다. –

+0

아래로 투표했습니다. 그것을하는 것은 끔찍한 생각이지만 다시 채울 수 있습니다. 또한 테이블을 자르면 ID가 – jean

+0

@jean으로 재설정됩니다. ID를 다시 시드해도 다른 이유로 인한 갭 문제는 해결되지 않습니다. 재충전해도 틈이 없음을 보장하지 않습니다. 그리고 모든 중간 ID를 업데이트해야합니다. 예, 방아쇠를 사용하여 수행 할 수 있지만 실제로는 식별 열이 아닙니다. –

0

하지 말아야 할 가장 좋은 방법 :

declare @max int; 
select @max = coalesce(max(key), 1) from table; 
dbcc checkident(table,reseed,@max) 

또한이 스레드를 보라. ID 필드가 있으면 값을 생성하도록합니다. 가치를 전달할 수 있기를 원한다면 자기 자신은 그다지 가치를 인정하지 않습니다.

그러나 당신이 이런 일을 할 수있는 다음 무엇을하려고하고 싶지 않는 경우에 ...

CREATE TABLE new_employees 
(
ID int IDENTITY(1,1), 
NAME varchar (20), 
BALANCE int 
) 
GO 
INSERT INTO new_employees (NAME, BALANCE) 
VALUES ('Name 1', 1),('Name 2', 2),('Name 3', 3), 
('Name 4', 4),('Name 5', 5) 
GO 

DELETE FROM new_employees 
WHERE ID > 3 

DBCC CHECKIDENT ('new_employees', RESEED,0) -<-- with seed value 0 

확인 ID 정보 : 현재 ID 값 '5', 현재 열 값 '0'.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 인쇄 한 경우 시스템 관리자에게 문의하십시오.

DBCC CHECKIDENT ('new_employees', RESEED) --<-- WIth out any seed value 

이 가장 높은 둥지 가능 Indentity 값으로 값을 다시 시드됩니다.

검사 ID 정보 : 현재 ID 값 '0', 현재 열 값 '3'.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 인쇄 한 경우 시스템 관리자에게 문의하십시오.

INSERT INTO new_employees (NAME, BALANCE) 
VALUES ('Name 4', 4),('Name 5', 5),('Name 6', 6)