2009-05-06 2 views
0

잘 설계된 것인지 잘 모르겠습니다. 수행 방법에 대해 조언 해주세요. 내가는 SQL 서버 2008 테이블 A가 테이블 B에서 부패하는 경우 테이블 A에 새 레코드를 삽입하는 방법

을 사용하고

  • 내가 가진 :

    TableA (TableA_ID int identity PK, Value varchar(10), TableB_ID PK not null) 
    TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID PK not null) 
    

    을 목표는 간단하다 : 이상이있는 경우에만

    • TableA의 행을 가질 수 있습니다 TableA의 TableA에 연결된 1 행.
    • TableB의 각 행에 대해 표 A에 연관된 행이 있어야합니다.

    TableA는 "부모 테이블"이고 TableB는 "아동용 테이블"입니다. 부모는 1 명 이상의 자녀가 있어야하며 각 자녀는 1 명의 부모 만 가질 수 있습니다.

    이게 맞습니까?

    내가 가지고있는 문제는 INSERT 문을 수행하려고 할 때입니다. 이것이 맞으면 어떻게 INSERT를 작성해야합니까? 제약 조건을 일시적으로 사용 중지 하시겠습니까?

    감사합니다. 내가 부모가 자녀에 의존하지 않는

+0

부모에게 자녀가 있어야합니까? 나는이 요구 사항이 존재할 수있는 상황을 아직 경험하지 못했습니다 ... – BenAlabaster

+0

예 ... 이상하게 들리 겠지만, –

+0

사실 SQL Server는 지연된 외래 키 제약 조건을 지원할 수 없습니다. 오, 글쎄, 매일 새로운 것을 배워라! –

답변

0

를 삽입 할 때

제가하는 데 문제는있다. 표 A의 표 B에 대한 참조를 제거해야합니다.

0

순환 종속성이 있습니다. 이들은 선언적 집행을 위해 실제로 잘 작동하지 않습니다. 삽입 할 때마다 제약 조건을 비활성화해야합니다.

1
TableA (TableA_ID int identity PK, Value varchar(10)) 
TableB (TableB_ID int identity PK, Value varchar(10), TableA_ID not null) 

부모로, 표 a는 표 a에 필드가 있어야하므로 표 b를 참조 할 필요가 없습니다. 이것을 일대 다 관계라고합니다.

그래서 테이블에 이러한 값을 가질 수있는 :

1 a 
2 b 
3 c 

테이블에서 당신이 할 수 b를 : 표 A에서 데이터를 표시하는 쿼리를 만들 수 있습니다

지금
1 asdf 1 
2 sdfg 1 
3 pof 2 
4 dfgbsd 3 

을 이 번호는 다음과 같습니다.

select b.TableB_ID, b.Value, a.TableA_ID, a.Value 
from TableB b 
inner join TableA 
on b.TableA_ID=a.TableA_ID 
0

비정상적인 요구 사항입니다. 만약 내가 그걸로 붙어 있다면 (그리고 나는 정말로 그것이 정말로 요구 사항인지 확인하기 위해 뒤로 물러 설 것이다) 나는 다음과 같이 이것을 디자인 할 것이다.

부모 a와 b가있는 테이블 a에서 테이블 b까지 정규 외래 키를 만든다. 아이.

테이블이 레코드가 삽입 될 때 레코드가 존재하지 않으면 테이블 b에 레코드를 삽입하는 트리거를 테이블 a에 추가하십시오. 테이블 b의 마지막 관련 레코드가 삭제 된 경우 테이블을 삭제하는 다른 트리거를 테이블 b에 추가하십시오.

또는, 저장된 프로 시저의 두 테이블에 삽입을 넣을 수 있습니다. proc를 통하지 않고 테이블에 대한 모든 삽입 권한을 제거하십시오. 마지막 레코드가 삭제되면 레코드가 삭제된다는 것을 보장하기 위해 테이블 ​​b와 테이블 b의 외래 키 관계와 테이블 b의 트리거가 필요합니다. 하지만이 경우 테이블 a에서 방아쇠를 당길 수는 있습니다.

테이블 b의 정보가 테이블 a의 트리거에서 찾을 수없는 경우를 제외하고 첫 번째 시나리오를 사용합니다. 하나 이상의 값이없는 필수 필드는 말할 수 없습니다. a.

0

나는 삽입을 삽입 할 것이다 : 제약 조건을 해제하고, 데이터를 삽입하고, 제약 조건을 활성화한다. 제약 조건이 비활성화되어있는 동안이 트랜잭션이 진행 중인지 확인해야 할 수도 있습니다.

격리 수준을 SERIALIZABLE로 설정하면이를 달성 할 수 있지만 순차적으로 동시성을 높일 수 있습니다.

Kev

관련 문제