- 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;