2011-04-27 4 views
1

도와주세요! 예를 들어, 1, 2, 4, 6, 8, 10, 11 .... 등 의 ID 필드가있는 테이블이 있습니다.SQL 서버에서 ID 열 값을 재정렬하십시오

순차적으로 만들고 싶습니다. , 1,2,3,4,5,6,7 ... 방울 사용하지 않고

감사합니다.

+1

아래의 답변 외에도 레코드를 고유하게 식별하는 것 외에도이 ID 필드에 첨부 된 의미가 없어야합니다. 송장 번호 또는 포장 번호 또는 누군가에게 어떤 것을 의미하는 다른 종류의 번호가 있어서는 안됩니다. – Leslie

+0

왜 이것을하고 싶습니까? –

답변

3

수 없습니다. identity 열을 업데이트 할 수 없습니다. (또는 적어도 정상적인 방법으로는 불가능합니다. 테이블에서 모든 행을 삭제 한 다음 IDENTITY_INSERT으로 다시 삽입하십시오.

또한 identity의 간격은 용어로 사용하는 것이 가장 좋은 방법입니다 와! 표시 목적으로 인접한 일련의 숫자가 필요한 경우 ROW_NUMBER을 사용할 수 있습니다.

+1

신원 정보에는 공백이 생기며 나중에 롤백되는 레코드뿐만 아니라 롤백 된 모든 레코드에 대해 소모됩니다. – HLGEM

1

새 필드를 만들어서 1에서 시작하는 종자가되게 한 다음 이전 열을 삭제하고 새 열의 이름을 바꾼 다음 (모든 FK 참조를 다시 작성하는 이유는 무엇입니까?)

+0

SQL Server에서는 열의 ID 속성을 변경할 수 없습니다. 원본 열 전체를 삭제하고 새 ID 열을 만들어야합니다. 새 주문이 이전 주문과 일치한다는 보장은 없습니다. –

+0

@ 마틴 - 사실이 아닙니다. SQL Server 2005/2008 관리자의 UI를 통해 열을 변경하여 열의 자동 번호 (ID) 속성을 제거 할 수 있습니다 (테이블을 마우스 오른쪽 단추로 클릭하고 "디자인"선택). –

+0

실제로 장면 뒤에서 전체 테이블을 다시 작성합니다. 도구 모음에서 "스크립트"아이콘을 클릭하여 생성 된 SQL을 확인하십시오. –

1

쉬운 방법이 없기 때문에해야 할 이유가 없습니다. 그러나 비슷한 기능을 제공하기 위해 뷰를 구성 할 수 있습니다.

CREATE VIEW MyTableView AS SELECT ROW_NUMBER() OVER (ORDER BY Identity) AS RowNum, * FROM MyTable 

그런 다음 클라이언트를 대신 MyTableView에서 선택하십시오.

뷰와 테이블의 이름이 같아야 이전 버전과의 호환성을 보장 할 수 있으므로 물론 테이블 이름을 바꾼 다음 이전 테이블 이름으로 뷰를 만들 수 있습니다.

+0

질문을 완전히 잘못 읽었을 때 대답이 수정되어야합니다. –

0

DBCC CHECKIDENT (< '테이블 이름'>, RESEED, < '테이블의 마지막 순서 **'>)를 입력 할 때

이 **이 수에 1을 더한 (+1)을 만들 것입니다. 즉 새로운 레코드에 대해 38가되어야하므로이 값으로 37이 사용됩니다.

1

나는 ... 당신이 그것을 좋아하는 경우에 그 시도 .. 가장 좋은 방법이라고 생각

DECLARE @INC AS INTEGER 
SET @INC = 1 
WHILE (@INC <= 7582) --7582 is rowcount of table 
BEGIN 
    UPDATE YourTable 
    SET ID = @INC 
    WHERE ID = (
       SELECT MIN(ID) AS T 
       FROM YourTable 
       WHERE ID > @INC 
      ) --ID=> Identity column 
    SET @INC = @INC + 1 
END 

참고 : 열 신원 삽입물을 분리 할 필요가 있음을 실행하기 전에.

관련 문제