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 테이블명 은 해당되지 않는것인가요??
|