1. 외래 키 제약 조건이란 무엇입니까?
외래 키 제약 조건 ( FOREIGN KEY , 약어로 FK )은 데이터베이스 테이블의 참조 무결성을 구현하는 데 사용됩니다. 외래 키 제약 조건은 특히 데이터 무결성을 보장하는 계단식 수정 또는 삭제 작업의 경우 두 테이블을 밀접하게 결합할 수 있습니다.
외래 키는 테이블의 필드 값이 다른 테이블의 필드 값에 따라 달라지며 종속 필드에는 기본 키 제약 조건 또는 고유 제약 조건이 있어야 함을 의미합니다 . 종속 테이블은 일반적으로 상위 테이블 또는 기본 테이블이라고 하며 외래 키 제약 조건이 있는 테이블은 하위 테이블 또는 슬레이브 테이블이라고 합니다.
2. 외래 키 제약 조건의 예
학생과 클래스의 관계를 표현하려면 먼저 학생 테이블과 클래스 테이블이라는 두 개의 테이블이 있어야 하고 학생 테이블에는 stu_class라는 필드가 있어야 합니다(이 필드는 학생이 속한 클래스를 나타냄). , 이 필드의 값 범위는 클래스에 의해 결정됩니다. 테이블의 기본 키 cla_no 필드(이 필드는 클래스 번호를 나타냄)의 값이 결정됩니다. 그런 다음 클래스 테이블은 기본 테이블이고 학생 테이블은 슬레이브 테이블이며 stu_class 필드는 학생 테이블의 외래 키입니다. 학생 테이블과 클래스 테이블 간의 관계는 stu_class 필드를 통해 설정됩니다.
학생 테이블을 이런 식으로 설계하면 두 가지 단점이 있습니다.
- 단점 1: 데이터 중복
- 단점 2: 클래스 데이터 수정 시 여러 레코드를 변경해야 함
학생 테이블은 다음과 같이 설계할 수 있습니다.
이상,
클래스 테이블은 상위 테이블 로 알려져 있으며 클래스 번호는 기본 키 입니다.
학생 테이블은 자식 테이블 이라고 하며 클래스 이름은 외래 키 입니다 .
3. 외래 키 제약 조건의 SQL 표시
1. 하위 테이블은 상위 테이블에 종속되므로 먼저 상위 테이블을 생성하십시오.
create table t_class(
cno int(4) primary key auto_increment,
cname varchar(10) not null,
room char(4)
);
2. 테이블 클래스에 데이터를 추가합니다.
insert into t_class values (null,'Python一班','r803');
insert into t_class values (null,'Python二班','r416');
insert into t_class values (null,'Java一班','r103');
3. 하위 테이블 생성: 학생 테이블 t_student
외래 키를 생성할 때 컬럼 이름은 다를 수 있지만 컬럼 유형과 길이는 기본 키와 일치해야 합니다.
create table t_student(
sno int(6) primary key auto_increment,
sname varchar(5) not null,
classno int(4)
);
4. 학생 정보 추가
insert into t_student values (null,'张三',1);
insert into t_student values (null,'李四',1);
insert into t_student values (null,'王五',1);
5. 마스터 테이블을 슬레이브 테이블과 연결
외래 키 제약 조건, 외래 키 제약 조건은 테이블 수준 제약 조건만 추가하고 열 수준 제약 조건은 추가하지 않아야 합니다.
하위 테이블 t_student에 외래 키 제약 조건을 추가하고 제약 조건 이름을 fk_stu_classno로 지정하고 t_student의 외래 키 classno를 t_class의 기본 키 cno와 연결합니다.
alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno);
6. 연결 성공 여부 테스트
현재 학생 테이블은 다음과 같습니다.
클래스 테이블은 다음과 같습니다.
테스트 1: t_class 테이블에서 클래스 1 삭제
예상 결과: 클래스 테이블과 연결된 학생 테이블에서 클래스 1에 학생이 있기 때문에 삭제가 불가능해야 합니다. 학생이 클래스 2와 3을 가지고 있지 않기 때문에 클래스 2와 3을 삭제할 수 있어야 합니다.
delete from t_class cno=1;
실행은 1451 오류를 반환합니다.
> 1451 - 상위 행을 삭제하거나 업데이트할 수 없음: 외래 키 제약 조건 실패(`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY(`classno`) REFERENCES `t_class`(`cno`))
외래 키 제약 조건의 영향을 받기 때문입니다.
테스트 2: 클래스 2 삭제
성공적으로 삭제되었습니다.
테스트 3: 학생 테이블에 데이터를 추가하고 이 학생은 클래스 3에 있으며 클래스 3 삭제를 시도합니다.
insert into t_student values (null,"老六",3);
클래스 3 삭제:
delete from t_class where cno=3;
이 시점에서 1451 오류가 반환되어 기본 키가 이미 외래 키에 의해 제한되었음을 나타냅니다.
테스트 4: 외래 키를 사용하여 자식 테이블에 클래스 4의 동급생 추가
insert into t_student values (null,"小七",4);
1452 오류를 반환합니다.
> 1452 - 자식 행을 추가하거나 업데이트할 수 없음: 외래 키 제약 조건 실패(`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY(`classno`) REFERENCES `t_class`(`cno`))
기본 테이블에 클래스 4가 없기 때문입니다.
넷째, 마스터/슬레이브 테이블 삭제
먼저 슬레이브 테이블을 삭제한 다음 마스터 테이블을 삭제해야 합니다. 그렇지 않으면 삭제할 수 없습니다.
기본 테이블을 먼저 삭제하면 다음 오류가 반환됩니다.
> 3730 - 't_student' 테이블의 외래 키 제약 조건 'fk_stu_classno'에서 참조하는 't_class' 테이블을 삭제할 수 없습니다.
다섯째, 외래 키 전략
일부 작업으로 인해 클래스 테이블과 학생 테이블 데이터가 혼동되기 때문에 이제 다음 데모를 위해 이 두 테이블을 다시 만듭니다.
요구 사항: 클래스 2를 삭제하고 싶습니다.
그러나 직접 삭제할 수는 없습니다. 외래 키 제약이 있기 때문에 외래 키 전략 추가를 고려할 수 있습니다 .
1. 전략 1: 조치 없음 작업이 허용되지 않음
먼저 클래스 2 학생의 클래스 번호를 null로 변경할 수 있습니다.
update t_student set classno=null where classno=2;
다시 삭제
delete from t_class where cno=2;
2. 전략 2: 계단식 계단식 운영: 마스터 테이블을 운영할 때 슬레이브 테이블의 외래 키 정보에 영향을 미칩니다.
계단식 작업을 추가하기 전에 클래스 번호를 업데이트해 보십시오.
update t_class set cno=5 where cno=3;
1451 오류를 반환합니다.
> 1451 - 상위 행을 삭제하거나 업데이트할 수 없음: 외래 키 제약 조건 실패(`database_me`.`t_student`, CONSTRAINT `fk_stu_classno` FOREIGN KEY(`classno`) REFERENCES `t_class`(`cno`))
계단식 계단식 작업을 사용하려면 이전 외래 키 제약 조건을 삭제해야 합니다.
alter table t_student drop foreign key fk_stu_classno;
그런 다음 외래 키 제약 조건을 다시 추가합니다.
alter table t_student
add constraint fk_stu_classno
foreign key (classno) references t_class (cno)
on update cascade on delete cascade
;
on update cascade on delete cascade는 업데이트 및 삭제 시 계단식 작업이 있음을 의미합니다.
수업 번호를 다시 업데이트하십시오.
update t_class set cno=5 where cno=3;
삭제 작업을 시도하고 클래스 번호가 5인 클래스를 삭제합니다. 삭제하기 전에 학생 테이블에 5명의 학생이 있음을 알 수 있습니다.
클래스 테이블에서 5개의 클래스를 삭제합니다.
delete from t_class where cno=5;
클래스 테이블 보기:
학생 테이블을 다시 살펴보십시오.
캐스케이드 작업의 마스터 테이블이 변경되면 그에 따라 슬레이브 테이블의 데이터도 변경되는 것을 볼 수 있습니다. 계단식 작업은 프로덕션 라이브러리에 더 큰 영향을 미치므로 주의해서 사용해야 합니다.
3. 전략 3: null 작업 설정
이전 외래 키 제약 조건을 제거합니다.
alter table t_student drop foreign key fk_stu_classno;
외래 키 전략의 null 작업을 사용하여 새 외래 키 제약 조건을 추가합니다.
alter table t_student add constraint
fk_stu_classno foreign key (classno) references t_class (cno)
on update set null on delete set null
;
클래스 테이블 클래스 번호 업데이트를 시도하십시오.
update t_class set cno=8 where cno=1;
클래스 테이블 보기:
학생 테이블을 보려면 다음을 수행하십시오.
전략 2의 계단식 작업과 전략 3의 블랭킹 작업을 조합하여 사용할 수 있습니다. 예를 들어 업데이트 작업을 위해 계단식 작업을 추가하고 삭제 작업을 위해 블랭킹 작업을 추가합니다.
alter table t_student add constraint
fk_stu_classno foreign key (classno) references t_class (cno)
update cascade on delete set null
;
두 애플리케이션 시나리오는 다음과 같이 다릅니다.
친구 서클을 삭제할 때 아래 댓글도 함께 삭제되므로 친구 서클 삭제 작업은 캐스케이드 작업을 사용할 수 있습니다.
수업을 해산할 때 수업에 있는 학생은 여전히 존재하며 학생의 수업 정보는 비어 있도록 설정할 수 있습니다. 왜냐하면 나중에 새 수업이 학생에게 할당되므로 수업을 해산하는 작업이 공백 작업을 추가할 수 있기 때문입니다. .