2017-02-11 6 views
0

좋은 하루 여러 값을 병합 할 경우,SQL 서버 외래 키 : 우리가

의 우리가 그 열이있는 부모 테이블이 있다고 가정 해 봅시다 :

[1] id, int, Identity, Primary 
[2] name, nvarchar, unique 

그리고 자식 테이블 :

[1] parent, nvarchar, FK reference [parent].[name], ON UPDATE CASACADE 
[2..] other columns 

부모 테이블에 여러 항목이있는 경우 (예 :

)
| id | name | 
| 0 | test1 | 
| 1 | test2 | 
| 2 | test3 | 

이고 모두 [자식] 테이블에서 행을 참조했습니다. "test1"을 test3에 "병합"하려는 경우 (즉 test1에 대한 모든 행이 test3이되어야 함), [parent]. [name]은 고유합니다 ...이 문제를 해결할 방법이 있습니까? 문제?

+2

나는 그것을 얻지 못한다. 성취하고자하는 결과를 보여주십시오. 또한이를 테이블에 대한 업데이트로 사용할지 또는 쿼리의 결과로 사용할지 여부를 명확히하십시오. –

+0

왜 자식 테이블의 부모를 nvarchar로 참조합니까? INT 인 상위 ID 열에 의해 부모와 자녀를 연결하는 것이 좋습니다. 또한 가장 좋은 방법은 항상 nvarchar 열의 길이를 지정하는 것입니다. nvarchar (30). – andrews

답변

1

name을 외래 키로 선택한 이유가 확실하지 않아서 부모 테이블에 id이있는 이점을 잃어 버렸습니다.

올바르게 이해하면 : 'test1'을 참조하는 모든 하위 행을 'test3'으로 이동하고 'test1'을 모두 없애는 것입니다. 내가 c[2]로하고 p[1]으로 사용하고이 예를 들어

: 응답자의

update c set parent='test3' where parent = 'test1'; 
delete from p where name='test1'; 
1

모두 위의 PK/FK 관계에 대한 참조를 확인하고 난 강력하게 동의합니다. 기본 테이블의 ID 열을 PK로 만들고 FK를 PK ID 값과 동일하게 설정하는 것이 좋습니다.

기본 테이블이 정상적으로 보입니다. 문제가있는 FK 참조입니다. 나는에 (질문에 규정 된) 자식 테이블을 변경합니다 :

[1] parentid, int, FK reference [parent].[id], ON UPDATE CASACADE 

주요 질문에 대한 답변이 그것을 cascade 옵션과 아무 상관이 새로운 PK를 참조하는 외국인 테이블을 갱신되지만, 외부 테이블 행과 연관된 PK 고유 이름을 변경합니다. 외래 키를 변경하면 다음 두 개의 t-sql 문을 실행할 수 있습니다.

UPDATE Child 
SET parentid = 2 
WHERE parented = 0 

DELETE 
FROM Parent 
WHERE ID = 0