데이터베이스는 여러 개의 테이블로 구성되기 마련이다. 이들 테이블은 특정 키(혹은 필드)를 매개로 서로 연결이 되는데, 이 키를 외래키(foreign key)라고 한다. RDBMS(Relational database management system)에서 명시적으로 테이블을 연결(relation)해주는 장치다. 아래는 joinc 사이트의 유저 관리 테이블이다.
이 3개의 테이블은 user.id로 연결된다. preference 테이블과 bookmark 테이블의 userid가 외래키이다. 다른 말로 이 두 테이블은 userid를 키로 user.id를 참조한다고 할 수 있다.
기본키 : 외래키가 참조하는 키. 이 경우 user.id가 기본키다.
외래키 : 기본키를 참조하는 키
Child 테이블 : 외래키를 가지고 있는 테이블
user.id 값이 없는데, perference, bookmark에 레코드가 들어가면 안된다는 제약조건이 걸린다. 여러 이유로 존재하지 않는 user.id를 key로 해서 INSERT를 할 경우 에러를 반환한다. 반대로 user.id를 삭제하려 할 때도, 이 값을 외래키로 참조하는 테이블이 있다면 에러를 반환한다.
이러한 일들은 외래키를 설정하지 않고, 애플리케이션에서 몇 개의 쿼리를 조합하는 것만으로도 수행 할 수 있다. 유저가 서비스에서 탈퇴하면 user 테이블에서 레코드를 삭제해야 할 건데, preference와 bookmark에를 삭제하는 쿼리를 만들어서 수행해되 된다. 하지만 개발자가 하는 일이니 만큼 실수가 있을 수 있어서 데이터 정합성이 깨질수 있다. 시스템에 맡길 수 있는 건 맡기는게 좋겠다.
제약조건을 위반하기 때문에 실패한다. 외래키가 참조하고 있는 기본 키(PersonID = 3)을 삭제해야 유저를 삭제 할 수 있다. 주문이력이 남아있는 상태에서 유저를 삭제하면 안되므로 이러한 행동은 올바르다고 볼 수 있다.
기본키를 삭제할 때, 해당 기본키를 외래키로 하는 모든 값이 삭제되야 하는 경우도 있을 것이다. 그냥 DELETE를 이용해서 삭제해도 되겠지만, 테이블 구조가 복잡할 경우 까다로운 작업이 될 수 있다.
MySQL은 단일 DELETE 쿼리에 대해서 하위 테이블의 데이터를 자동으로 삭제 할 수 있도록 외래키에 대해서 ON DELETE CASCADE설정을 할 수 있다.
Contents
1. MySQL 외래키
2. 테스트
3. ON DELETE CASCADE 가 영향을 주는 테이블 찾기
4. 참고
1. MySQL 외래키
2. 테스트
3. ON DELETE CASCADE 가 영향을 주는 테이블 찾기
4. 참고
Recent Posts
Archive Posts
Tags