Search

2015년 11월 5일 목요일

[Database] [MSSQL] 테이블 ~은(는) FOREIGN KEY 제약 조건에 의해 참조되므로 자를 수 없습니다. 외래키 문제 해결하기.

* 예를 들어, A_Table의 A_Column_1이 PK이고(참조의 대상이 됨),
B_Table의 B_Column_1가 FK라고 가정했을 경우,
어느 두 테이블의 내용을 강제로 변경하려면 다음과 같은 에러 문구가 뜬다.

테이블 'A_Table'은(는) FOREIGN KEY 제약 조건에 의해 참조되므로 자를 수 없습니다.


* 아래의 코드로 A_Table에 걸린 FK(외래키)를 확인해보자.

EXEC sp_fkeys 'A_Table'

* 위 쿼리의 실행 결과에서 주요하게 봐야할 내용은 다음의 다섯 필드이다.

FK_NAME             | (A_Table_FK01)  | FK(외래키) 이름
FKTABLE_NAME     | (B_Table)         | FK(외래키)가 있는 테이블의 이름
FKCOLUMN_NAME | (B_Column_1)   | FK(외래키)가 걸린 필드의 이름
PKTABLE_NAME     | (A_Table)         | 참조 대상의 PK(기본키)가 있는 테이블의 이름
PKCOLUMN_NAME | (A_Column_1)   | 참조 대상의 컬럼의 이름


* 여기서 FK_NAME을 확인해 FK를 제거해주자.

ALTER TABLE B_Table drop A_Table_FK01

* 이후 원하는 쿼리를 진행한다

(DROP or TRUNCATE 등등의 쿼리...)


* 쿼리 결과를 확인한 후, 다시 FK를 복구해줘야 한다.

ALTER TABLE B_Table WITH CHECK ADD CONSTRAINT A_Table_FK01 FOREIGN KEY(B_Column_1) REFERENCES A_Table(A_Column_1)

* A_Table에 FK가 제대로 잡혔는지 다시 한번 확인해주자.

EXEC sp_fkeys 'A_Table'

* 추가로, DB의 모든 테이블에 걸려있는 FK를 확인하려면 다음과 같이 하면 된다. (네이밍 룰에 따라 아래의 like 절이 다를 수 있음.)

SELECT * FROM sysobjects WHERE xtype = 'F' and name like '%FK%'


댓글 없음:

댓글 쓰기