DB/명령프롬프트 - mysql 예시

[MySQL] 트리거 trigger 예제 : after insert, new 사용

congs 2023. 3. 30. 15:37

트리거 생성

: buy테이블의 값이 생성되면 product테이블의 재고량, 판매량이 변동되는 트리거

  • 생성 : insert
  • 재고량 : amout
  • 판매량 : sale_amount
  • 예) 홍길동이 에어나시를 3개 구매 => 재고량 -3, 판매량 +3 
mysql> drop trigger if exists insert_buy;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> delimiter //

mysql> create trigger insert_buy after insert on buy
    -> for each row
    -> begin
    -> declare _amount int default 0;
    -> set _amount = new.amount;
    -> update product set
    -> amount = amount - _amout,
    -> sale_amount = sale_amount + _amount
    -> where name = new.product_name;
    -> end //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

 

만든 trigger 확인 

  • 직접 insert로 넣는 경우
  • 만약, select로 찾아 넣는 경우는 불가능 ( trigger을 실행하는 동안 select의 접근을 막음)
mysql> insert into buy(customer, product_name, price, amount)
    -> values ('지키미','양털 겨울 코트',50000,5);
Query OK, 1 row affected (0.00 sec)

-- 17번에 주문이 들어간 것을 확인
mysql> select * from buy;
+-----+----------+-------------------+-------+--------+---------------------+
| num | customer | product_name      | price | amount | buy_date            |
+-----+----------+-------------------+-------+--------+---------------------+
|   1 | 홍길동   | 폴라티셔츠        | 15000 |      3 | 2023-03-24 17:22:02 |
|   2 | 홍길순   | 에어나시          |  9000 |      5 | 2023-03-24 17:22:02 |
|   3 | 이순신   | 양털 겨울 코트    | 50000 |      1 | 2023-03-24 17:22:02 |
|   5 | 동글님   | 순면라운드 반팔티 | 15900 |      3 | 2023-03-27 09:44:58 |
|   6 | 다래     | 순면라운드 반팔티 | 15900 |      3 | 2023-03-27 09:48:31 |
|   7 | 다래     | 폴라티셔츠        | 15000 |      3 | 2023-03-27 10:32:45 |
|   8 | 졸려     | 순면라운드 반팔티 | 15900 |      5 | 2023-03-27 10:33:14 |
|  15 | 홍길동   | 에어나시          |  9000 |      3 | 2023-03-30 15:24:03 |
|  16 | 홍길동   | 에어 나시         |  9000 |      3 | 2023-03-30 15:25:20 |
|  17 | 지키미   | 양털 겨울 코트    | 50000 |      5 | 2023-03-30 15:31:49 |
+-----+----------+-------------------+-------+--------+---------------------+
10 rows in set (0.00 sec)

-- 양털 겨울 코트의 amount가 -5 된 것을 확인
mysql> select * from product;
+-----+------------+--------------+---------------------+--------+--------+-------------+---------------+
| num | type_a     | type_b       | name                | price  | amount | sale_amount | register_data |
+-----+------------+--------------+---------------------+--------+--------+-------------+---------------+
|   1 | 티셔츠     | 긴소매       | 폴라티셔츠          |  15000 |     50 |           0 | 2020-10-15    |
|   2 | 티셔츠     | 반소매       | 순면라운드 반팔티   |  15900 |     50 |           0 | 2020-09-15    |
|   3 | 티셔츠     | 반소매       | 순면라운드 반팔티   |  15900 |     50 |           0 | 2020-09-15    |
|   4 | 티셔츠     | 반소매       | 에어 나시           |   9000 |     47 |           3 | 2020-11-10    |
|   5 | 패션운동복 | 트레이닝상의 | 피트니스상의        |  30000 |     50 |           0 | 2020-11-05    |
|   6 | 패션운동복 | 트레이닝하의 | 피트니스하의        |  50000 |     50 |           0 | 2020-11-06    |
|   7 | 아우터     | 재킷         | 양면 롱 후리스 자켓 | 233000 |     50 |           0 | 2020-11-05    |
|   8 | 아우터     | 패딩         | 롱 패딩 점퍼        |  47400 |     50 |           0 | 2020-11-01    |
|  30 | 아우터     | 코트         | 양털 겨울 코트      |  50000 |     45 |           5 | 2020-10-31    |
+-----+------------+--------------+---------------------+--------+--------+-------------+---------------+
9 rows in set (0.00 sec)