2013-09-06 4 views
1

ID 및 상태 (인디애나) 이름이있는 상태라는 테이블이 있습니다. 동일한 테이블을 사용하여 각 상태에 인접한 상태의 테이블을 만들어야합니다. 내가 할 때마다 순환 참조를 실행합니다. 이것은 SQL Server와 같습니다. 삭제 및 업데이트와 관련된 계단식 연결을 원합니다.동일한 테이블이있는 순환 참조가없는 테이블 스키마

STATES 
Id 
State 

이것은 내가 원하지만 순환 참조 오류가 계속 발생합니다. 어떻게 든 상태 테이블에서 두 ID를 결합해야합니까?

STATES   ADJOININGSTATESTATE  ADJOININGSTATE 
       Id 
Id  ->  StateId    -> StateId 
State   AdjoiningStateId  -> Id 
+0

당신은 당신의 테이블에 대한 다이어그램을 게시 할 수 있습니까? – Lamak

+0

로렌스 (Laurence)는 탁자에 대해 옳은 생각을 가지고 있습니다. 그러나 그것이 내가 시도한 것입니다. –

답변

1

SQL Server에서는 이와 같이 계단식 연결을 허용하지 않으므로 트리거를 사용해야합니다. 다음은 삭제하는 방법의 예입니다. 업데이트가 필요하다고 결정한 경우 독자에게 연습 문제로 남겨 둡니다. 이 병목이 될 것입니다 경우 SQL의 특정 버전에

Create Table AdjoiningStates (
    State1ID int not null constraint FK_AdjoiningStates_States1 Foreign Key References States, 
    State2ID int not null constraint FK_AdjoiningStates_States2 Foreign Key References States, 
    Constraint PK_AdjoiningStates Primary Key (State1ID, State2ID) 
) 
Go 
Create Trigger States_Delete On States Instead Of Delete As 
    Delete AdjoiningStates From AdjoiningStates a inner join deleted d on a.State1ID = d.StateID 
    Delete AdjoiningStates From AdjoiningStates a inner join deleted d on a.State2ID = d.StateID 
    Delete States From States s inner join deleted d on s.StateID = d.StateID 
Go 

은 그것을 여러 번 사용하기 전에 임시 테이블에 삭제 된 테이블을 복사하는 것이 더 효율적입니다.

Example Fiddle

+0

삭제 및 업데이트를 계단식으로 연결해야한다고 생각합니다. –

+0

sMsg 1785, 수준 16, 상태 0, 줄 1 'AdjoiningState'테이블에서 FOREIGN KEY 제약 조건 'FK_AdjoiningStates_States2'를 사용하면 사이클 또는 여러 개의 계단식 경로가 발생할 수 있습니다. NO DELETE NO ACTION 또는 UP UP NO NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오. 메시지 1750, 수준 16, 상태 0, 줄 1 제약 조건을 만들지 못했습니다. 이전 오류를 참조하십시오. –

+0

이제 문제가 생겼습니다. 대신 방아쇠로 답변을 업데이트했습니다 – Laurence