IT수업/데이터베이스

it 수업 6주차 (14) 제약조건 PK, FK

워제하 2024. 1. 31. 12:47

 

이번에는 제약조건에 대해 적어볼 것이다.

 

먼저 기본키(PK)를 본다.

 

이렇게 테이블 tbl_aa를 만들고 id 컬럼에 기본키를 설정해준다.

이 테이블의 구조를 살펴보면 이렇게 기본키가 설정된 것을 볼 수 있다.

 

tbl_aa의 설정에 들어가서 index탭을 보면 자동으로 인덱스 설정이 되어있는 것을 볼 수 있는데 id열이 오름차순으로 되어 있는 것을 볼 수 있다.

 

그래서 여기에 값을 1이 아닌 2부터 넣어주고 나중에 1을 넣어도 pk가 오름차순으로 index되어 있기 때문에 1번 값이 먼저 나오게 된다.

 

또 다른 기본키를 설정하는 방법은 이런게 있다.

그러면 이렇게 기본키가 설정 된 것을 볼 수 있다.

 

 

다음은 두개의 열을 기본키로 설정하는 것이다.

이렇게 설정하면 id열과 name열에 기본키가 설정되는 것을 볼 수 있다.

 

 

다음은 명령어로 열 정보를 보는 방법이다.

 

select * from information_schema.columns where table_schema='shopdb' and column_key='PRI'; 이렇게 하면 information_schema 데이터베이스의 열들을 보는데 조건으로 table_schema 안의 테이블명인 shopdb의 기본키만 보도록 하는 방법이다.

 

 

또 다른 테이블을 만들었는데 이 테이블은 not null을 설정해주는 것이다.

 

 

< PK 추가 >

이제는 구조변경(제약조건 추가)를 해볼 것이다.

 

alter table 테이블명 add constraint PK명 primary key(열1, 열2);

tbl_dd 테이블에는 아직 기본키 값이 설정되어 있지 않는데 명령어를 적어서 id열과 name열 모두에게 기본값을 설정해줄 것이다.

 

alter table tbl_dd add constraint PK_tbl_dd_id primary key(id,name);

 

 

 

< PK 삭제 >

다음은 PK를 삭제 해볼 것이다.

alter table tbl_dd drop primary key; 로 삭제하면 기본키가 사라진 것을 볼 수 있다.

 

 

 

<연습문제>

 

 

create table buytbl_copy(select * from buytbl);
alter table buytbl_copy add constraint pk_buytbl_copy primary key(num);

desc buytbl_copy;

 

 

 

 

 

이번에는 외래키(FK)를 살펴볼 것이다.

먼저 tbl_aa테이블을 만드는데 id열에 primary key를 적용해 만들어준다.

 

 

그리고 tbl_bb도 만들어준다. 이때 tbl_aa의 기본키를 외래키로 가져올 것이다.

외래키 설정은

constraint 외래키명 foreign key(외래키열명) references tbl_a(기본키열명) 이렇게 해주면 된다.

 

tbl_bb의 외래키를 살펴보면 tbl_aa의 id 값이 외래키로 설정 된 것을 볼 수 있다.

 

또 index탭으로 가면 인덱스도 설정된 것을 볼 수 있다.

 

 

-- FK Options(외래키열의 옵션 정리)
-- RESTRICT       : PK, FK 열의 값의 변경 차단
-- CASCADE        : PK 열의 값 on Update, on Delete 이 변경시 FK 열의 값도 함께 변경
-- SET NULL        : PK 열의 값이 변경시 FK 열의 값을 NULL로 설정
-- SET DEFAULT : PK 열의 값이 변경시 FK 열의 값은 Default로 설정된 기본값을 적용
-- NO ACTION     : PK 열의 값이 변경시 FK 열의 값은 변경되지 않음으로 설정

 

 

 

명령어로 외래키 옵션을 설정해 볼 것이다. 

외래키 설정은 on update 외래키 옵션 on delete 외래키 옵션 으로 하게 된다.

 

명령어를 입력한 후 설정에 들어가 외래키 옵션을 살펴보면 각각 CASCADE, SET NULL로 설정된 것을 볼 수 있다.

 

 

 

<연습 문제>

 

 

create table copy_buytbl(select * from buytbl);
alter table copy_buytbl add constraint pk_copy_buytbl primary key (num);
alter table copy_buytbl add constraint fk_copy_buytbl foreign key (userid) references buytbl(userid) on update cascade on delete restrict;
desc copy_buytbl;