2009-12-12 5 views
3

SQL Server 2008을 사용하고 있습니다. 고유 한 순차 번호를 생성 할 수 있습니까? NEWID()의 특성과 식별 컬럼을 표시해야합니다. 이는 항상 고유하지만 후속 값이 이전 값보다 큼을 의미합니다. 그것은 고유하지 않기 때문에 datetime/datetime2 일 수 없습니다.순차적 NEWID()

감사합니다.

+0

"NEWID()"의 속성 (예 : 세계적으로 고유 한 *)은 무엇을 의미합니까? –

+1

guid가 현재 구현에서 실제로 전역 적으로 고유하지는 않지만 적어도 통계적으로 고유하다는 것을 알고 있습니다. 꾸준히 증가하는 가치와 함께, 그 자산은 사라졌습니다. 여기서 실제로 해결하고자하는 문제는 무엇입니까? –

+0

"글로벌 고유 순차 번호"는 정적 GUID (서버에 대해 한 번 생성)와 일반 ID (숫자) 열을 결합하기 만하면됩니다. –

답변

1

ROWVERSION 데이터 유형은 기본 키로 사용하기에 적합하지 않지만 한 가지 가능성이 있습니다. 자동으로 설정됩니다.

또 다른 옵션은 직접 작성하는 것입니다. 필요한 너비의 열이있는 테이블을 가지며 값을 원자 적으로 증분하여 반환하는 코드가 있어야합니다. 적절한 잠금 또는 트랜잭션을 사용하면 기본 키로 적합 할 값을 생성 할 수 있습니다.

SQL CLR 기능과 비슷한 기능을 수행 할 수도 있습니다. 그렇게 효율적으로 만들 수도 있습니다. 예를 들어, 현재 시간을 사용할 수 있지만 리턴 된 마지막 값은 정적으로 저장할 수 있습니다. 그런 다음 다음 값이 마지막 값과 같으면 1 씩 증가시킵니다.

1

SQL Server 2008의 UNIQUEIDENTIFIER 열에 대한 기본값으로 newsequentialid()을 정의 할 수 있습니다. 불행히도 그게 모두 가능합니다.

CREATE TABLE dbo.MyTable 
(
    ID UNIQUEIDENTIFIER DEFAULT (newsequentialid()) 
    ...... 
) 

당신은 사용을 순차적 uniqueidentifiers에 대한 기본 제약 조건이 있어야합니다

+0

그래도 NewSequentialId() 시퀀스에는 빈번한 갭이있을 것입니다. http://stackoverflow.com/questions/738801/sql-server-2008-newsequentialid-problem#10696208 – StuartLC

7
CREATE TABLE demo_table (
    demo_id uniqueidentifier NOT NULL, 
    demo_value int 
); 

ALTER TABLE demo_table ADD CONSTRAINT dc_demo 
         DEFAULT NEWSEQUENTIALID() 
         FOR demo_id; 

:-(다른 방법을 순차적 ID의 (GUID를) 생성하는 방법은 없습니다. 불행하게도

의 제한 NEWSEQUENTIALID()은 시스템 재부팅 후에 시퀀스가 ​​보장되지 않는다는 것입니다.

01의 주요 목표는은 B-tree 삽입이 빠른이고 컴퓨터 재부팅 문제는 영향을 미치지 않습니다. 이 여기에 설명되어 있습니다 :

당신은 NEWID(), NEWSEQUENTIALID()IDENTITY 사이의 성능 비교에 대한이 문서 확인하실 수 있습니다 : "The Code Project: Performance Comparison - Identity() x NewId() x NewSequentialId을".

+2

newsequentialid()의 문제는 Windows가 다시 시작된 후 잠재적으로 낮은 범위에서 시작할 수 있다는 것입니다. 일부 시나리오에서는 이것이 허용되지 않습니다. – niaher

+0

시퀀스가 ​​간격을두기 위해 기계를 재부팅 할 필요가 없습니다. http://stackoverflow.com/questions/738801/sql-server-2008-newsequentialid-problem#10696208을 참조하십시오. – StuartLC

2

다시 시작한 후에는 단조롭게 증가하기 때문에 숫자 IDENTITY를 사용하십시오. NEWSEQUENTIALID는 이것을 지원하지 않습니다.

당신이 자신의 결합 된 칼럼을 발명하지 않으면 케이크를 먹을 수 없습니다. 그러나, 이것은 사용하는 것이 더 넓고 더 복잡하게 만듭니다.

IDENTITY와 NEWSEQUENTIALID는 모두 내부 용 (예 : 사람이 읽을 수 없음)이어야하므로이 요구 사항이 필요한 이유는 무엇입니까?

관련 문제