MySQL에서 외래 키의 기본?


91

MySQL의 외래 키 구조를 사용하는 방법에 대한 좋은 설명이 있습니까?

나는 MySQL 문서 자체에서 그것을 얻지 못합니다. 지금까지 저는 조인 및 프로그래밍 코드를 사용하여 외래 키와 같은 것을 처리했습니다.

그리고 질문의 두 번째 부분은 MySQL의 내장 된 외래 키를 사용하여 개선 할 사항이 있습니까?

답변:


117

FOREIGN KEYS 데이터가 일관 적인지 확인하십시오.

효율성 측면에서 쿼리를 개선하지 않고 잘못된 쿼리를 실패하게 만듭니다.

다음과 같은 관계가있는 경우 :

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

이면의가있는 department경우 삭제할 수 없습니다 employee.

당신이 제공하면 ON DELETE CASCADE받는 FOREIGN KEY정의, 참조하는 행이 참조 된 것들과 함께 자동으로 삭제됩니다.

제약으로 FOREIGN KEY실제로 쿼리 속도가 약간 느려집니다.

참조 된 테이블에서 삭제하거나 참조하는 테이블에 삽입 할 때 추가 검사를 수행해야합니다.


1
일반적으로 인덱싱 된 필드에서 FK를 만들어 관련 값을 쉽게 찾을 수 있기 때문에 속도 저하가 최소화됩니다.
Seb

4
나는 "조금"쓴 이유입니다 :) 사실, 당신의 행의 삭제를 많이, 기본 JOIN훨씬 덜 효율적일 수있다이 FULL TABLE SCAN의 사용이 개 DELETE의
Quassnoi

2
반대표로 죄송합니다. 우연 이었지만 투표를 변경할 수 없습니다.
Wondercricket 2015 년

8
@Wondercricket : 지금 무엇을해야할지 모르겠습니다. 사이트 규칙의 회색 영역입니다. 당신이 모스크바에있을 때 맥주를 사주는 것 같아요.
Quassnoi

1
@stack : 참조 된 키에 대한 모든 업데이트는 참조 테이블에 계단식으로 연결됩니다.
Quassnoi

32

실제 외래 키 사용의 주요 이점은 데이터 무결성을 보장하고 무언가가 수정되거나 삭제 될 때 관련 항목에 대해 계단식 작업을 설정할 수 있다는 것입니다.

예를 들어, 포럼을 프로그래밍한다고 가정 해보십시오. 기본 키가있는 "topics"테이블 이 있고, topic 테이블에 대한 외래 키인 topics.topic_idposts.topic_id이있는 주제에 게시물이 첨부 된 "posts"테이블 이 있습니다.

이 외래 키 관계는 모든 게시물이 유효한 주제에 첨부되도록합니다. 당신이 가진 유일한 주제가 ID # 1 인 경우, 주제 # 2에 첨부 된 데이터베이스에 게시물이 존재하는 것은 불가능합니다. 데이터베이스가이를 보장합니다.

계단식 이점을 위해 주제 테이블에서 주제가 삭제되면 데이터베이스가이 주제에 첨부 된 posts 테이블의 모든 게시물을 자동으로 삭제하도록 설정할 수 있습니다. 여러 테이블이 함께 연결되어있을 때 매우 복잡해질 수있는 수동으로 수행해야하는 단계를 제거하기 때문에 좋습니다. 외래 키를 사용하면 모든 관계를 자동으로 정리할 수 있습니다.


11

1. FOREIGN KEYS는 데이터의 일관성을 보장합니다.

2. 외래 키 정의에 캐스케이드 삭제를 적용하면 상위 행이 삭제 될 때 참조 행이 자동으로 삭제됩니다.

3. Update Cascade를 외래 키 정의에 적용하면 상위 행이 업데이트 될 때 하위 행이 자동으로 업데이트됩니다.

쿼리 : ALTER TABLE 자식 ADD FOREIGN KEY (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. 직접 부모 테이블을 삭제할 수 없으며 부모 테이블을 삭제하는 것보다 먼저 자식 테이블에서 외래 키를 삭제합니다.

7
마침내 외래 키 예제에 대해 혼란스러워하는 것을 깨달았습니다. 네 아이 의 아버지로서 나는 아이가 부모를 추적 하는 데 익숙하지 않습니다 . 40 년 정도 후에 이것은 더 이상 거꾸로 보이지 않을 수도 있습니다.
Bob Stein

1
"child"및 "parent"와 같은 예제 테이블 이름을 지정해 주셔서 감사합니다. 실제로 도움이되었으며 공식 문서가 그렇게 되었으면합니다.
마이크 설치류

7

가장 큰 장점은 테이블에 입력 할 수있는 값을 제한 할 수 있다는 것입니다. 참조 된 테이블에없는 값을 입력하려고하면 입력 할 수 없습니다.

또한 참조 된 테이블의 값을 업데이트하거나 삭제하는 경우 값을 자동으로 업데이트하거나 해당 값을 포함하는 모든 행을 계단식으로 삭제하도록 설정할 수 있습니다.

실제로 코드를 활용하는 훌륭한 기능입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.