2008-09-30 3 views
0

주어진 위치에 대해 고유 한 ID를 만들어야하며 위치 ID는 순차적이어야합니다. 기본적으로 기본 키와 비슷하지만 locationID에 묶여 있다는 점만 다릅니다. 따라서 3 개의 다른 위치 모두 1,2,3,4,5, ..., n과 같은 ID를 갖습니다.주어진 위치에 대해 전 세계적으로 유일한 정수 기반 ID (순차적)

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 또한 주어진 위치에 대해 nextID를 가져 오는 안전한 방법이 필요합니다. 다음 ID를 가져 오는 저장 프로 시저에 트랜잭션을 넣을 수 있습니다.

+0

기본 키와 순차 키가 모두 필요합니까? –

답변

1

다음 트랜잭션 ID를 찾기 위해 코드를 래핑하고 동일한 트랜잭션에서 행을 저장하는 코드를 원할 것입니다. 당신이 원하지 않는 (의사) :

transaction { 
    id = getId 
} 

... other processing 

transaction { 
    createRowWithNewId 
} 

해당 ID를 가진 다른 객체가 "... 다른 처리"나는이 작업을 수행 본 적이있는 방법 중

2

한 동안 저장 될 수 있기 때문에이 만드는 것입니다 위치를 다음 ID에 매핑하는 테이블

... 
UPDATE LocationID SET @nextID = NextID, NextID = NextID + 1 WHERE Location = @Location 
... 

은 위의 매우 휴대용하지 않을 수 있습니다 당신이 증가 된 값을 받고 끝날 수도 값을 증가하는 동안 저장 프로 시저 내부

CREATE TABLE LocationID { 
    Location varchar(32) PRIMARY KEY, 
    NextID int DEFAULT(1) 
} 

당신은 현재의 값을 업데이 트를하고 드실 수 있습니다 현재의 것 대신에. 원하는대로 열의 기본값을 조정할 수 있습니다.

또 다른주의해야 할 점은 얼마나 자주이 작업을 수행 할 것인지, 다른 저장 프로 시저 또는 응용 프로그램 코드에서 충돌 할 것인지 여부입니다. 다른 저장 프로 시저에서 온 것이면 한 번에 하나씩 사용할 수 있습니다. 애플리케이션 코드에서 값을 치려고한다면, 값의 범위를 잡아 내고 애플리케이션으로 하나씩 옮긴 다음 다른 범위를 잡는 것이 더 나을 것입니다. 응용 프로그램에 여전히 절반 할당 블록이있는 동안 응용 프로그램이 다운되면 시퀀스에 간격이 생길 수 있습니다.

0

지속성이 필요하지 않은 경우 쿼리에서 항상이를 테이블 자체에 저장하는 대신 수행 할 수 있습니다.

select 
    locationID 
    ,row_number() over (partition by locationID order by (select null)) as LocationPK 
From 
    YourTable 
관련 문제