트리거 시험에 나온다
! 인덱스를 쓰지 않은 이상 update를 할때는 기본키만 된다. 기말엔 erd를 주고 트리거를 만드는 형태로 문제가 나온다!
쿼리문의 트리거를 보면서 이해
트리거는 남발했다간 성능이 저하되고 락이 걸릴 수 있다, 신중하게 쓰자
시험범위
조인,내장함수,외부조인,서브쿼리, 뷰, 트리거, 관계대수,
db설계이론
create database tritest;
use tritest;
create database trianswer;
use trianswer;
create table goods(
pronum char(4) primary key,
proname varchar(20) not null,
price int,
stock int default 0
);
create table ordering(
num int auto_increment primary key ,
pronum char(4),
orderdate date not null,
account int check(account > 0),
orderprice int check (orderprice > 0),
foreign key (pronum) references goods(pronum) on update cascade on delete cascade
);
create table sales(
num int auto_increment primary key,
pronum char(4),
account int,
foreign key (pronum) references goods(pronum)
);
INSERT INTO goods ( pronum, proname, price ) VALUES ('AAAA', '새우깡', 1500);
INSERT INTO goods ( pronum, proname, price ) VALUES ('BBBB', '초코파이', 1200);
INSERT INTO goods ( pronum, proname, price ) VALUES ('CCCC', '짱구', 1500);
-- delimiter 쓰는 이유 <- 세미콜론 때문에 써야된다, 시험에는 delimiter까지 전부 다 써야된다!
delimiter //
create trigger triin
after insert on ordering for each row
begin
update goods
set stock = stock + new.account
-- where의 pronum은 goods의 pronum, new.pronum은 ordering의 pronum이다
where pronum = new.pronum;
end;//
delimiter //
create trigger triup
after update on ordering for each row
begin
update goods
set stock = stock + (new.account - old.account)
where pronum = new.pronum;
end;//
delimiter //
create trigger tridel
after delete on ordering for each row
begin
update goods
set stock = stock - old.account
where pronum = old.pronum;
end;//
delimiter //
create trigger triinsal
after insert on sales for each row
begin
update goods
set stock = stock - new.account
where pronum = new.pronum;
end;//
insert into ordering (pronum,orderdate,account,orderprice) values('AAAA','2023-11-21',10,1000);
insert into ordering (pronum,orderdate,account,orderprice) values('BBBB','2023-10-21',15,1000);
insert into ordering (pronum,orderdate,account,orderprice) values('CCCC','2023-09-11',10,1000);
insert into ordering (pronum,orderdate,account,orderprice) values('AAAA','2023-11-21',10,1000);
update ordering set account = 5 where num = 1;
select * from ordering;
select * from goods;
drop trigger triin;
delete from ordering where num = 10;