>데이터 베이스 >MySQL 튜토리얼 >ROW_NUMBER()에서 ORDER BY를 사용하지 않고 SQL Server 2005에서 비식별 열을 자동 증가시키려면 어떻게 해야 합니까?

ROW_NUMBER()에서 ORDER BY를 사용하지 않고 SQL Server 2005에서 비식별 열을 자동 증가시키려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-26 18:44:09480검색

How Can I Auto-Increment a Non-Identity Column in SQL Server 2005 Without Using ORDER BY in ROW_NUMBER()?

SQL Server 2005에서 ORDER BY 방지 ROW_NUMBER()

한 테이블의 데이터를 다른 테이블에 삽입할 때 자동 증가가 바람직한 경우가 많습니다. 대상 테이블의 ID가 아닌 열입니다. 이를 달성하기 위해 ROW_NUMBER() 함수를 사용할 수 있지만 일반적으로 ORDER BY 필드가 필요합니다. 그러나 소스 테이블의 원래 순서를 유지해야 하는 경우 대체 접근 방식을 찾아야 합니다.

명시적인 순서를 피하는 솔루션에는 다음 코드가 포함됩니다.

INSERT dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};

이 코드는 창 함수를 활용하여 상수 값을 기반으로 행 번호를 계산함으로써 ORDER BY 절의 필요성을 효과적으로 대체합니다. 또한 동시성 문제를 방지하기 위해 쿼리는 대상 테이블의 최대값을 계산하는 동안 잠금 힌트(TABLOCKX 및 HOLDLOCK)를 사용합니다.

이 접근 방식에서는 순서를 명시적으로 지정하지 않지만 순서를 명시적으로 지정하지 않는다는 점에 유의하는 것이 중요합니다. 소스 테이블의 원래 순서가 유지된다는 보장은 없습니다. 외부 쿼리 순서와 같은 요소는 여전히 결과에 영향을 미칠 수 있습니다. 데이터베이스 관점에서 "원래 순서 유지"라는 개념은 실제로 존재하지 않습니다.

최적의 동시성과 데이터 무결성을 위해 이 해결 방법보다 ID 열을 사용하는 것이 좋습니다. 꼭 필요한 경우가 아니면 잠금 힌트를 통한 단독 테이블 잠금은 피해야 합니다.

위 내용은 ROW_NUMBER()에서 ORDER BY를 사용하지 않고 SQL Server 2005에서 비식별 열을 자동 증가시키려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.