본문 바로가기
CLASS/MYSQL

#5-1 / 각종 key 상세,trigger - 실무

by eungSe__ 2024. 6. 10.

❗ table을 어떻게 만드느냐에 따라 java에서 핸들링하는 방식이 바뀜

 

show create table table명  : 어떻게 제작했는지 상세하게 출력

show index from table명  : 현재 key가 어떻게 등록되어있는지 출력

 

key의 우선순위
primary key ▶ unique ▶ multi (다중 key) ▶ foreign key

 

⚡ primary key

- auto_increment 사용시 무조건 해당 key로 등록되어야 함 -> primary key에 미등록시 error

   * key 를 한개이상 등록시 or 형태로 구분되어짐  => primary key(idx,id) : 둘중에 하나라도 틀리면 정상적으로 등록됨

      ∴ 통상적으로 auto_increment만 primary key에 등록

- 두개 이상 등록해도 multi key로 등록되지 않음

- 두개 이상 등록되어있으면 다른 table이랑 연결되어있구나


⚡ unique 그룹명

: 중복되지 않는 값 

사용방법

1. 괄호에 여러개의 column명을 입력하여 multi key 형태로 구성하는 방식 (multi key : or )

2. 별도의 unique 그룹을 이용하여 중복값을 체크하는 방식 ( and )

create table info(
idx int(4) not null auto_increment,
itext char(100) not null,
id char(30) not null,
infotext text not null,
primary key(idx),
unique bbb(itext),
unique bbb2(id)
);

=> good

    ★ unique 별도로 지정시 기존 data와 일치하는게 하나라도 있으면 등록 불가 ( and )

 

create table info(
idx int(4) not null auto_increment,
itext char(100) not null,
id char(30) not null,
infotext text not null,
primary key(idx),
unique bbb(itext),
unique bbb2(id,infotext)
);

=> 자료형이 너무 크면 unique로 등록 불가 (infotext - text)

 

 

⚡ foreign key ( : 외래키)

: 부모 table과 자식 table을 연결하는 key  - 반드시 foreign "key" 사용 (unique 처럼 다른거 사용 불가)

 

1. 부모 table을 제작 후 자식 table을 생성 시 primary key 또는 unique 중에서 연결하고자 하는 key를 references 로 연결하여 사용함

   => 부모 table에서 연계될 column은 반드시 primary key 또는 unique 안에 들어가 있어야 함

        - 처음에 설계할 때 잘 생각해야함, 갑자기 추가 항목이 있다면,, 다 삭제후 첨부터 다시 설계,,,

 

2. 자식 table이 연결되어있을 경우 부모 table을 삭제하지 못함 , column명 변경도 자식table 먼저

3. data 삭제 - 자식 table에 있는 data를 삭제 후 부모 table의 data 삭제 가능

4. data 등록 - 부모 table에 data 먼저 등록

 

5. column(= field)명 동일하게 구성하지 않아도 됨 (헷갈리기 때문에 실무에선 동일하게 맞추거나,mb_id 이런식으로 많이 사용)

6. data양 맞추지 않아도 됨 (but 헷갈리기 때문에 실무에선 맞춰서 사용)

 

=> 일치하는 data가 있어야지만 insert 가능

// -- member table
create table mb(
idx int(6) not null auto_increment,
id char(20) not null,
name char(30) not null,
email varchar(30) not null,
primary key(idx),
unique (id)
);

// -- coupon table
create table cp(
cidx int(4) not null auto_increment,
cpname varchar(200) not null,
mb_id char(20) not null,
primary key(cidx),
foreign key(mb_id) references mb (id)
);

references
- mb table의 id colomn과 동기화 하겠다
- foreign 작성시 multi key로 잡힘

 

ex ) 

회원 table (부모 table)

- 쿠폰 table

- 장바구니 table

- 결제 table (결제 성공, 결제 실패)

- 로그기록 table

- 포인트 table

- 휴면 table

 

상품 table (부모 table)

 


 

trigger :  

event (insert,updatae,delete)가 발생시 자동으로 문법이 실행되는 구조

oracle에도 있음

 

[ colomn명 trigger 선언문 ] - after 기준

old : update,delete

new : insert, update

 

[trigger 전체 구조현황]

delimiter 별명명칭
create trigger 가상의 트리거 이름
after 명령어 문법(update,insert,delete 중 하나)
on 기존 table명
for each row
begin

↓ 자동으로 실행될 SQL명령어 구문 
ex) insert into dropmb (idx,id,name,email) values ('0',old.id,old.name,old.email);
end 별명명칭
delimiter;

 

 

ex 1) 

 -- 휴면고객 table 생성

create table dropmb(
idx int(6) not null auto_increment,
id char(20) not null,
name char(30) not null,
email varchar(30) not null,
primary key(idx),
unique (id)
);

 

-- delete trigger 생성

delimiter $$ 
create trigger remove_user
after delete //after update라면 insert에 new 사용 가능
on mb
for each row
begin
insert into dropmb (idx,id,name,email) values ('0',old.id,old.name,old.email);
end $$
delimiter;

show triggers;  로 확인
drop trigger remove_user; 로 삭제 (trigger만 삭제됨, dropmb는 그대로)

//old. : 본 테이블의 column명

=> 결과값 출력 안될시 나갔다 들어오거나 $$+enter

 

🔽 🔽 🔽

본 table에서 삭제시 dropmb로 insert됨

 

 

ex 2) update

delimiter $$
create trigger update_user
after update
on mb
for each row
begin
insert into dropmb (idx,id,name,email) values ('0',new.id,new.name,new.email);
end $$
delimiter;

update mb set email='hong123@nate.com' where idx='1';

=> update 하면 dropmb에 insert됨

 

 

ex 3 ) insert

delimiter $$
create trigger insert_user
after insert
on mb
for each row
begin
insert into dropmb (idx,id,name,email) values ('0',new.id,new.name,new.email);
update dropmb set email='test@gmail.com';
end $$
delimiter;

insert into mb values ('0','kim4','김우빈','kimsu@naver.com');

=> 여러개의 명령어 구문 사용 - 기존 table에 insert시 dropmb에 insert + 모든 메일 변경

 

 

ex 4 ) 주의 - mysql trigger에는 select 문법을 사용하지 못함 - 아예 걍 먹지를 않음

           ( 단 mssql,oracle trigger에서는 가능 ! )

delimiter $$
create trigger insert_user
after insert
on mb
for each row
begin
insert into dropmb (idx,id,name,email) values ('0',new.id,new.name,new.email);
select * from dropmb;  //요롷게
end $$
delimiter;