❗ 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
🔽 🔽 🔽
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;
'CLASS > DATABASE' 카테고리의 다른 글
mysql -> json 변환 사이트 (0) | 2024.07.01 |
---|---|
#5-2 / trigger 응용문제 , signed,unsigned (0) | 2024.06.10 |
#4-2 / view 응용 문제 , view select가 안됨 해결-권한문제 (0) | 2024.06.05 |
#4-1 / group by , table및 column 복제 등 (0) | 2024.06.05 |
#3-5 / 기타(enum,set,timestamp) (0) | 2024.06.04 |