[MySQL] 외래 키 제약 조건 및 외래 키 전략

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
		;

두 애플리케이션 시나리오는 다음과 같이 다릅니다.

친구 서클을 삭제할 때 아래 댓글도 함께 삭제되므로 친구 서클 삭제 작업은 캐스케이드 작업을 사용할 수 있습니다.

수업을 해산할 때 수업에 있는 학생은 여전히 ​​존재하며 학생의 수업 정보는 비어 있도록 설정할 수 있습니다. 왜냐하면 나중에 새 수업이 학생에게 할당되므로 수업을 해산하는 작업이 공백 작업을 추가할 수 있기 때문입니다. .

Supongo que te gusta

Origin blog.csdn.net/hold_on_qlc/article/details/130127739
Recomendado
Clasificación