MySQL의 외래 키 구조를 사용하는 방법에 대한 좋은 설명이 있습니까?
나는 MySQL 문서 자체에서 그것을 얻지 못합니다. 지금까지 저는 조인 및 프로그래밍 코드를 사용하여 외래 키와 같은 것을 처리했습니다.
그리고 질문의 두 번째 부분은 MySQL의 내장 된 외래 키를 사용하여 개선 할 사항이 있습니까?
답변:
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
실제로 쿼리 속도가 약간 느려집니다.
참조 된 테이블에서 삭제하거나 참조하는 테이블에 삽입 할 때 추가 검사를 수행해야합니다.
JOIN
훨씬 덜 효율적일 수있다이 FULL TABLE SCAN의 사용이 개 DELETE의
실제 외래 키 사용의 주요 이점은 데이터 무결성을 보장하고 무언가가 수정되거나 삭제 될 때 관련 항목에 대해 계단식 작업을 설정할 수 있다는 것입니다.
예를 들어, 포럼을 프로그래밍한다고 가정 해보십시오. 기본 키가있는 "topics"테이블 이 있고, topic 테이블에 대한 외래 키인 topics.topic_id
열 posts.topic_id
이있는 주제에 게시물이 첨부 된 "posts"테이블 이 있습니다.
이 외래 키 관계는 모든 게시물이 유효한 주제에 첨부되도록합니다. 당신이 가진 유일한 주제가 ID # 1 인 경우, 주제 # 2에 첨부 된 데이터베이스에 게시물이 존재하는 것은 불가능합니다. 데이터베이스가이를 보장합니다.
계단식 이점을 위해 주제 테이블에서 주제가 삭제되면 데이터베이스가이 주제에 첨부 된 posts 테이블의 모든 게시물을 자동으로 삭제하도록 설정할 수 있습니다. 여러 테이블이 함께 연결되어있을 때 매우 복잡해질 수있는 수동으로 수행해야하는 단계를 제거하기 때문에 좋습니다. 외래 키를 사용하면 모든 관계를 자동으로 정리할 수 있습니다.
1. FOREIGN KEYS는 데이터의 일관성을 보장합니다.
2. 외래 키 정의에 캐스케이드 삭제를 적용하면 상위 행이 삭제 될 때 참조 행이 자동으로 삭제됩니다.
3. Update Cascade를 외래 키 정의에 적용하면 상위 행이 업데이트 될 때 하위 행이 자동으로 업데이트됩니다.
쿼리 : ALTER TABLE 자식 ADD FOREIGN KEY (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE;