2009-06-18 1 views
1

두 테이블이 있습니다. 첫 번째에는 ID 인 기본 키가 있고 두 번째 테이블에는 기본 키가 없지만 해당 키에는 외래 키 제약 조건이 있습니다. 첫 번째 테이블의 기본 키로 돌아갑니다.관계가 1에서 0-1 인 두 개의 테이블에 기반 삽입 설정

한 번에 하나의 레코드를 삽입하는 경우 두 번째 테이블에 삽입하려는 테이블 1에 삽입 된 pk의 값을 얻기 위해 Scope_Identity를 사용할 수 있습니다.

내 문제는 내가 두 테이블에 삽입 할 선택에서 오는 많은 레코드를 가지고, 나는 이러한 삽입 작업을 수행 할 수있는 집합 기반 방법을 생각할 수 없었어요.

현재 해결책은 커서를 사용하여 첫 번째 테이블에 삽입하고 scope_identity를 사용하여 키를 가져오고 두 번째 테이블에 삽입하고 반복합니다.

커서가없는 솔루션이 누락 되었습니까?

답변

2

예, 온라인 설명서에서 출력 절을 찾으십시오.

+0

유망하지만 문제/질문입니다. scope_identity 값을 사용할 수 있도록 입력 행의 올바른 행에 출력 행을 고유하게 일치시키기 위해 출력 절에서 제공하는 충분한 정보가 필요합니다. 항상 사용 가능한 것은 아닙니다. – automatic

+0

항상 고유해야하지 않으면 모든 열을 반환 할 수 있습니다. 고유하지 않을 경우 임시 ID에 대한 테이블의 다른 열을 추가하고 ID가있는 임시 테이블에 삽입 할 데이터를 넣은 다음 삽입 한 다음 그 ID와 실제 식별자를 output 절을 사용하고 temp id 값을 즉시 null로 설정하십시오. 동시성 문제가없는 경우 작동 할 수 있습니다. 동시성 문제가 발생하면 동일한 작업을 GUIDS를 임시 ID로만 사용하고 임시 테이블의 GUID와 일치하는 레코드는 null로 지정해야합니다. – HLGEM

0

저는 이번 주에이 문제가있었습니다. 누군가 자연스럽게 키가 사용되는 스키마에 의미없는 대리 키가있는 테이블을 도입했기 때문입니다. 의심 할 여지없이 나는 곧이 문제를 해결할 것입니다. 그 전까지는 INSERT에있는 데이터 테이블을 만들어서이 문제를 해결하려고합니다. 영구 또는 임시 기본 테이블 또는 파생 테이블 일 수 있습니다 (아래 참조). 어쨌든 세트 기반 솔루션에 대한 당신의 욕구. 이 테이블과 자연 키의 IDENTITY 열이있는 테이블 간의 조인을 사용하여 자동 생성 값을 찾습니다. 다음은 간단한 예입니다.

CREATE TABLE Test1 
(
surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE 
); 

CREATE TABLE Test2 
(
surrogate_key INTEGER NOT NULL UNIQUE 
    REFERENCES Test1 (surrogate_key), 
data_col INTEGER NOT NULL 
); 

INSERT INTO Test1 (natural_key) 
SELECT DT1.natural_key 
    FROM (
     SELECT '0000000001', 22 
     UNION ALL 
     SELECT '0000000002', 55 
     UNION ALL 
     SELECT '0000000003', 99 
     ) AS DT1 (natural_key, data_col); 

INSERT INTO Test2 (surrogate_key, data_col) 
SELECT T1.surrogate_key, DT1.natural_key 
    FROM (
     SELECT '0000000001', 22 
     UNION ALL 
     SELECT '0000000002', 55 
     UNION ALL 
     SELECT '0000000003', 99 
     ) AS DT1 (natural_key, data_col) 
     INNER JOIN Test1 AS T1 
      ON T1.natural_key = DT1.natural_key; 
관련 문제