database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9917 게시물 읽기
No. 9917
테이블 truncate할때 FK로 묶인 부모,자식 테이블의 관계
작성자
postgres
작성일
2017-11-22 10:04:25
조회수
1,197

 truncate를 테스트하다 보니 궁금한 사항이 있어 글남깁니다..

truncate 테이블명;  으로 테이블을 삭제하던 도중 오류로 인해 삭제가 되지 않는 테이블이 있었습니다. 

오류 내용은

truncate table pvs.tsh
ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "tsd" references "tsh".
HINT:  Truncate table "tsd" at the same time, or use TRUNCATE ... CASCADE.
===> 이런식인데 확인해보니
"자식"테이블(tsd)에게 FK로 참조되고있는 "부모"테이블(tsh)을 삭제하려는 경우에 자식테이블과의 fk연관성떄문에 truncate가 안된다는 에러입니다.
("부모"테이블을 참조하고 있는 "자식"테이블은 truncate로 정상적으로 data삭제가 됩니다.)
 
그래서 위 에러를 보고 어떤 자식테이블에게 참조되고 있는 부모테이블같은경우는 truncate 로 data삭제가 안되는구나 라고 생각했는데.
 
테이블들을 쭉 찾아보니까 자식테이블에게 참조되고 있는 또 다른 어떤 부모 테이블 같은 경우는 truncate에러없이 data 삭제가 잘 됐더라구요???
 
그래서 FK관련 내용을 찾아보니 FK를 사용하고 있는 부모,자식 테이블간에는 특정 제약조건이 있더라구요
data를 삭제하거나 테이블을 드롭할떄는 자식테이블 부터 삭제하고 나서 부모테이블을 삭제해야된다는 제약조건입니다.
 
그래서 다시 위 에러내용으로 돌아가면 자식테이블에게 참조되고 있는 부모테이블들 중 에러가 났던 부모 테이블들은 자신을 참조하고있는 자식테이블을 먼저 truncate하지 않고 부모테이블부터 truncate하려해서 에러가 났던것이고,
자식테이블에게 참조되고있는 또 다른 부모테이블 중 에러 없이 잘 truncate 된 부모 테이블 같은 경우엔 자신을 참조하고있는 자식테이블을 먼저 truncate를 하고 나서 부모테이블을 truncate했기 때문에 삭제가 잘 됐구나 라고
생각했습니다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------여기까지 제 생각이 맞는건가요???
그런데  truncate시에 에러가 났던 부모테이블을 다시 삭제하려고 그 테이블을 참조하고 있는 자식테이블을 다시 truncate [자식테이블]; 을 해줬습니다.(어차피 이 자식테이블은 이미 truncate가 된 테이블이죠)
그런다음 다시 지워준 자식테이블이 참조하고있는 부모테이블을 truncate했는데 오류가 나지 않아야 한다고 생각했는데 여전이 위 오류가 나면서 지워지지 않네요;;;
원인지 무엇인지 모르겠습니다... 위에 적어놓은 제약조건에서 얘기하는 테이블 data 삭제하거나 테이블을 드롭할때가 delete 테이블명 이나 drop 테이블명 만 해당되는것이고 truncate 테이블명 은 해당되지 않는것인가요??
 
 
 
이 글에 대한 댓글이 총 3건 있습니다.

모 이건 간단히 test해보시면 알수있는겁니다.

두개의 테이블 만드시고

하나는 자식,부모 테이블이라면

데이터가 없어도 FK에 의해 부모테이블은 truncate되지 않습니다.

자식 테이블을 drop을 하면 당연히 FK도 없어지겠죠?

결론적으로 FK를 제거하시고 truncate하세요.

 

김주왕(kimjuking)님이 2017-11-22 10:20:20에 작성한 댓글입니다.
이 댓글은 2017-11-22 10:20:44에 마지막으로 수정되었습니다.
감사합니다. 간단히 테스트를 해봤는데  FK로 연결된 자식테이블과 부모테이블이 있을때 
 자식 테이블에 FK로 설정된 컬럼에 data가 아에 없더라도
 FK 설정이 유효하여 부모테이블에 data들이 삭제가 안되네요
 
근데 이 경우는 truncate나 drop할떄의 경우이고, 
같은 상황에 delete from을 할떄는 또 삭제가 잘 됩니다. 
이것때문에 제가 헷갈린것 같고 
 
 
정리해보면
FK로 설정된 부모자식테이블이 있고 부모테이블엔 data가 있고, 자식테이블엔 data가 없을 경우
 
부모테이블을 "drop table [테이블명]"이나 "truncate [테이블명]"을 할 떄에는 자식테이블에 FK로 정의된 컬럼에 data가 없더라도 FK설정 자체 떄문에 오류가 납니다.
반면 부모테이블을 "delete from [테이블명]"을 할 때에는 자식테이블에 FK설정이 존재하더라도 그 컬럼에 data가 없다면 문제없이 delete가 됩니다.
 
drop,truncate와 delete간에 차이가 있네요
postgres님이 2017-11-22 11:01:24에 작성한 댓글입니다.
이 댓글은 2017-11-22 11:03:46에 마지막으로 수정되었습니다. Edit

 delete는 데이터의 fk제약을 체크 하는 것이고

drop, truncate는 테이블간 제약을 체크하는 것입니다.

truncate가 테이블 drop후 create로 동작하는 것이라...

박인호(paerae)님이 2017-11-22 15:31:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9920Index 질문 [1]
검콤이
2017-11-22
1288
9919이상한 에러.. [4]
궁금
2017-11-22
1383
9918쿼리 기본 질문 [1]
postgres
2017-11-22
1138
9917테이블 truncate할때 FK로 묶인 부모,자식 테이블의 관계 [3]
postgres
2017-11-22
1197
9916부모자식테이블간 참조하는 FK컬럼 조회 쿼리 [1]
postgres
2017-11-20
1183
9915소스에서 돌리던 계산을 function에서 하려는데요 [5]
최대호
2017-11-20
1181
9914HA 질문드립니다 [4]
검콤이
2017-11-20
1159
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.078초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다